<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>johnwhm (李少辉)</title>
    <link>https://ruby-china.org/johnwhm</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>用户 SSH 远程到后端执行命令时，保持用户的环境变量</title>
      <description>&lt;h2 id="用户ssh远程到后端执行命令时，保持用户的环境变量"&gt;用户 ssh 远程到后端执行命令时，保持用户的环境变量&lt;/h2&gt;
&lt;p&gt;项目中有个地方需要程序中 ssh 到另外一台机器去执行 ruby 代码，但是会遇到这样的情况：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ssh -p 10022 git@10.175.43.79 rvm list;
$bash: rvm: 未找到命令
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;why?&lt;/p&gt;

&lt;p&gt;直接登录到这台机器上看看呢？&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ssh -p 10022 git@10.175.43.79;
rvm list;
rvm rubies

   ruby-1.9.3-p551 [ x86_64 ]
   =* ruby-2.1.2 [ x86_64 ]

   # =&amp;gt; - current
   # =* - current &amp;amp;&amp;amp; default
   #  * - default

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;so，应该是在 ssh 执行命令的时候，没有携带用户的环境变量&lt;/p&gt;

&lt;p&gt;狗狗了一下，可以通过设置我想要登录机器的 SSHD 来允许保持用户环境&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$sudo vim /etc/ssh/sshd_config;
add:
PermitUserEnvironment yes;
$sudo service ssh restart;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改完了后端，还需要给执行 ssh 的机器添加想要携带的环境变量&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vim ~/.ssh/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置你所需要的 GEM_HOME，PATH 等（这里的值还是应该以 target 机器的为准）&lt;/p&gt;

&lt;p&gt;验证：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ssh -p 10022 git@10.175.43.79 rvm list;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>johnwhm</author>
      <pubDate>Mon, 28 Mar 2016 11:05:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/29477</link>
      <guid>https://ruby-china.org/topics/29477</guid>
    </item>
    <item>
      <title>使用 God 和 RVM 实现守护不同 Ruby 版本的服务</title>
      <description>&lt;h2 id="使用god和rvm实现守护不同ruby版本的服务"&gt;使用 god 和 rvm 实现守护不同 ruby 版本的服务&lt;/h2&gt;
&lt;p&gt;工作中有个项目用 ruby 做的分布式，前端是 rails+mysql 实现的，原来的 ruby 是 1.9.3，rails 是 2.3。后端 ruby 版本也是 1.9.3。我们小组几个人花了两个月的时间，对前端的 ruby 完成了 2.1.2 的升级，并且在后端做了一个基于 ruby2.1.2 的后端架构的改版，上线的时候为了稳妥起见，决定采用小步快跑的方式，后端机上要实现新旧架构同时存在，前端逐步从旧版往新版上挪。&lt;/p&gt;

&lt;p&gt;前端挪的工作比较容易，除了改一点配置以外，剩下的都是体力活。最大的问题可能是在后端，因为之前后端一直是在使用 god 来守护服务的，领导还是希望使用 god 来做这件事，那么我要解决的问题就是：** 如何实现使用 god 来支持两个 ruby 版本的服务 **。&lt;/p&gt;

&lt;p&gt;实现这个要求其实有两种思路：1、装两个 god，一个版本一个，都启动；2、在其中一个版本中装 god，然后用它去支持两个版本的服务。&lt;/p&gt;

&lt;p&gt;对比来说，肯定是第二种比较好，因为装两个 god 就等于说一个 god 的消耗进行了一次 double，这对于处女座的人来说是无法忍受的，所以果断放弃了（这么做其实更简单）。好，来说说第二种方法。&lt;/p&gt;

&lt;p&gt;首先我们只是用一个 god 就决定了我们只能用一个用户来进行上面的东西，在 ruby 的管理工具中，rvm 和 chruby 都是备选，chruby 相对于 rvm 更轻，rvm 对于大家来说可能更熟。按理来说放在服务器端运行的东西，chruby 应该更合适才对，但是这条道路上还有太多的坑还需要挖，我们还是暂时选择了 rvm，因为我们等所有的东西都挪到新后端后，我们还是要去 rvm 的，所有没有必要在管理工具上消耗太多精力。&lt;/p&gt;

&lt;p&gt;rvm 是个好东西，功能还是比较多的，它会自动的去扫描你的文件夹下 Gemfile，.rvmrc，.ruby_version 中是不是有规定 ruby 版本的信息，我不喜欢用 Gemfile 和 rvmrc 来做规定 ruby 版本这件事，因为我不是每个项目都有 Gemfile，而 rvmrc 又太过复杂，影响我切换 ruby 版本的速度，.ruby_version 还是极好的！因为它真的特别简单，里面就只有一个 ruby 版本的信息，直接 &lt;code&gt;echo '2.1.2' &amp;gt; .ruby_version&lt;/code&gt; 。就 OK 了。&lt;/p&gt;
&lt;h2 id="好了，开始整！"&gt;好了，开始整！&lt;/h2&gt;
&lt;p&gt;装 rvm&lt;/p&gt;

&lt;p&gt;装 ruby&lt;/p&gt;

&lt;p&gt;设定一个 ruby 版本为 default，在这个版本上装 god&lt;/p&gt;

&lt;p&gt;设定不同服务的 ruby 版本&lt;/p&gt;

&lt;p&gt;改 keep.god，start 都改成  &lt;code&gt;rvm in service_path do start command&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;修改启动项&lt;/p&gt;

&lt;p&gt;测试&lt;/p&gt;

&lt;p&gt;OK，搞完下班！&lt;/p&gt;</description>
      <author>johnwhm</author>
      <pubDate>Mon, 28 Mar 2016 10:49:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/29476</link>
      <guid>https://ruby-china.org/topics/29476</guid>
    </item>
    <item>
      <title>代码 review 时的一个小问题</title>
      <description>&lt;p&gt;今天在修改项目 model 中几个不好的方法，由于它们的调用比较多，所以定义了一个 methods_deprecate 的类方法，用来分发旧的方法，定义的方式如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;methods_deprecate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;define_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old_method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="nb"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unshift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old_method&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;eg:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;methods_deprecate&lt;/span&gt; &lt;span class="ss"&gt;:old_m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ss"&gt;:new_m&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;new_m&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行-&amp;gt;class_name.new.old_m 'aaa'
打印出：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;old_m
aaa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面是对实例方法的处理，运行起来还 ok，如果把 new_m 改成类方法，结果就很不理想了，我的 methods_deprecate 如何写才能实现能够处理 old_m 和 new_m 都为类方法；old_m 和 new_m 之一为类方法这三种情况呢？
求指教啊&lt;/p&gt;</description>
      <author>johnwhm</author>
      <pubDate>Fri, 12 Sep 2014 09:43:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/21494</link>
      <guid>https://ruby-china.org/topics/21494</guid>
    </item>
  </channel>
</rss>
