unicornがどのRubyバージョンで動作しているかを調べる

背景

以前、Railsアプリケーションが動作している環境のRubyのバージョンアップを行いました。Rubyのバージョンは正しく上がっているようでしたが、Railsアプリケーションの動作が不安定になってしまいました…その時の調査のログです。

原因

結果的にはunicornが旧Rubyバージョンで動作していることが原因でした。unicornがどのRubyバージョンで動作しているかを確認する方法を記載します。

確認方法

プロセスIDの確認

unicornのmasterプロセスを探します。

1
2
3
4
5
6
7
8
9
$ ps -ef | grep unicorn
user 1797 1 0 Jul29 ? 00:00:06 unicorn master -c /var/www/user-cms/current/config/unicorn/production.rb -E deployment -D
user 1840 1797 8 Jul29 ? 02:42:10 unicorn worker[0] -c /var/www/user-cms/current/config/unicorn/production.rb -E deployment -D
user 1847 1797 8 Jul29 ? 02:40:24 unicorn worker[1] -c /var/www/user-cms/current/config/unicorn/production.rb -E deployment -D
user 1857 1797 8 Jul29 ? 02:40:50 unicorn worker[2] -c /var/www/user-cms/current/config/unicorn/production.rb -E deployment -D
user 1872 1797 8 Jul29 ? 02:38:32 unicorn worker[3] -c /var/www/user-cms/current/config/unicorn/production.rb -E deployment -D
user 1894 1797 8 Jul29 ? 02:39:10 unicorn worker[4] -c /var/www/user-cms/current/config/unicorn/production.rb -E deployment -D
user 1909 1797 7 Jul29 ? 02:37:28 unicorn worker[5] -c /var/www/user-cms/current/config/unicorn/production.rb -E deployment -D
21235 42323 42237 0 00:47 pts/3 00:00:00 grep unicorn

masterプロセスのプロセスIDは1797とわかります。
次にrootになって、/proc/プロセスIDのディレクトリを確認します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$ sudo su -
# ls -l /proc/1797/
合計 0
dr-xr-xr-x 2 user user 0 7月 31 00:47 2020 attr
-rw-r--r-- 1 user user 0 7月 31 00:47 2020 autogroup
-r-------- 1 user user 0 7月 31 00:47 2020 auxv
-r--r--r-- 1 user user 0 7月 31 00:47 2020 cgroup
--w------- 1 user user 0 7月 31 00:47 2020 clear_refs
-r--r--r-- 1 user user 0 7月 31 00:46 2020 cmdline
-rw-r--r-- 1 user user 0 7月 31 00:47 2020 comm
-rw-r--r-- 1 user user 0 7月 31 00:47 2020 coredump_filter
-r--r--r-- 1 user user 0 7月 31 00:47 2020 cpuset
lrwxrwxrwx 1 user user 0 7月 31 00:47 2020 cwd -> /var/www/user-cms/releases/20200729065345
-r-------- 1 user user 0 7月 31 00:47 2020 environ
lrwxrwxrwx 1 user user 0 7月 31 00:47 2020 exe -> /usr/local/rbenv/versions/2.4.10/bin/ruby
dr-x------ 2 user user 0 7月 31 00:47 2020 fd
dr-x------ 2 user user 0 7月 31 00:47 2020 fdinfo
-r-------- 1 user user 0 7月 31 00:47 2020 io
-rw------- 1 user user 0 7月 31 00:47 2020 limits
-rw-r--r-- 1 user user 0 7月 31 00:47 2020 loginuid
-r--r--r-- 1 user user 0 7月 31 00:47 2020 maps
-rw------- 1 user user 0 7月 31 00:47 2020 mem
-r--r--r-- 1 user user 0 7月 31 00:47 2020 mountinfo
-r--r--r-- 1 user user 0 7月 31 00:47 2020 mounts
-r-------- 1 user user 0 7月 31 00:47 2020 mountstats
dr-xr-xr-x 6 user user 0 7月 31 00:47 2020 net
dr-x--x--x 2 user user 0 7月 31 00:47 2020 ns
-r--r--r-- 1 user user 0 7月 31 00:47 2020 numa_maps
-rw-r--r-- 1 user user 0 7月 31 00:47 2020 oom_adj
-r--r--r-- 1 user user 0 7月 31 00:47 2020 oom_score
-rw-r--r-- 1 user user 0 7月 31 00:47 2020 oom_score_adj
-r--r--r-- 1 user user 0 7月 31 00:47 2020 pagemap
-r--r--r-- 1 user user 0 7月 31 00:47 2020 personality
lrwxrwxrwx 1 user user 0 7月 31 00:47 2020 root -> /
-rw-r--r-- 1 user user 0 7月 31 00:47 2020 sched
-r--r--r-- 1 user user 0 7月 31 00:47 2020 schedstat
-r--r--r-- 1 user user 0 7月 31 00:47 2020 sessionid
-r--r--r-- 1 user user 0 7月 31 00:47 2020 smaps
-r--r--r-- 1 user user 0 7月 31 00:47 2020 stack
-r--r--r-- 1 user user 0 7月 31 00:46 2020 stat
-r--r--r-- 1 user user 0 7月 31 00:47 2020 statm
-r--r--r-- 1 user user 0 7月 30 22:38 2020 status
-r--r--r-- 1 user user 0 7月 31 00:47 2020 syscall
dr-xr-xr-x 5 user user 0 7月 31 00:47 2020 task
-r--r--r-- 1 user user 0 7月 31 00:47 2020 wchan

exeファイルのリンク先を確認すると、/usr/local/rbenv/versions/2.4.10/bin/rubyとなっており、Rubyの実行ファイルになっています。この場合だとバージョンは2.4.10ですね。今回はパスでバージョンがわかりますが、パスからわからない場合は、exeのリンク先の実行ファイルで-vオプションを実行すればバージョンがわかります。

おまけ

デプロイを行うのにcapistranoを使っているのですが、通常のデプロイシーケンスでは、unicornはworkerが再起動されるだけで、masterプロセスは再起動されませんでした。Rubyのバージョン変更を行った場合はmasterプロセスの停止・起動が必要となります。

自分の環境では以下のコマンドでunicornのmasterプロセスの再起動が行えました。

1
2
3
$ bundle exec cap production deploy:stop
$ bundle exec cap production deploy:start
(productionは環境名)

最初のコマンドでunicornを停止し、次のコマンドで起動しています。Rubyのバージョンを変更した場合は、masterプロセスの再起動が必要ということを覚えておきます。

この辺りを学ぶにはなるほどUNIXプロセスという本がとても役に立ちそうです。読み始めているのですが、とても楽しく読めています。機会があれば本の内容も紹介したいと思います。