ps aux の結果を Ruby からいい感じに出力


## 背景

- 定点的にプロセスのメモリを観測したくなりまして。
- AWS の CloudWatch だと割りとゆるっとしか見てくれないのので、もうちょっと細かく RSS や VSS を観測出来ないかな、cron とかで回せないかな、と思いました。

## 最初

- unixコマンドを叩いて適当に文字列処理しようとしました。

```
$ ps aux --sort -rss | head -n 10
```

- が、結構文字列処理がつらそうだなと思いました。(多分`split("\n")`とかでだいぶ苦しい感じになると踏みました)

```

$  ps aux --sort -rss | head -n 10
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql     1613  0.3  8.4 798092 163160 ?       Sl   00:30   4:13 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/lib/mysql/jector.err --pid-file=/var/lib/mysql/jector.pid
vagrant  21628  0.4  4.9 287652 94972 pts/4    Sl+  18:25   0:02 pry
td-agent  1991  0.2  2.6 261276 51700 ?        Sl   00:30   2:43 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
root      1196  0.0  2.0 302396 40156 ?        Ssl  00:30   0:11 /usr/sbin/glusterfs -s localhost --volfile-id gluster/nfs -p /var/lib/glusterd/nfs/run/nfs.pid -l /var/log/glusterfs/nfs.log -S /var/run/35bbdec0a200d158d8636306460640b8.socket
mongod    1756  2.1  1.8 696480 35336 ?        Sl   00:30  23:33 /usr/bin/mongod -f /etc/mongod.conf
td-agent  1988  0.0  1.3 219528 25512 ?        Sl   00:30   0:00 /usr/lib64/fluent/ruby/bin/ruby /usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
root      1309  0.0  1.2 297900 23204 ?        Ssl  00:30   0:10 /usr/sbin/glusterfs --acl --volfile-id=/ms2_devel --volfile-server=localnode /mnt/ms2_devel
root      1192  0.0  0.5 415384 10308 ?        Ssl  00:30   0:11 /usr/sbin/glusterfsd -s localnode --volfile-id ms2_devel.localnode.bricks-sdb1-ms2_devel -p /var/lib/glusterd/vols/ms2_devel/run/localnode-bricks-sdb1-ms2_devel.pid -S /var/run/70575b79a080da8a80cedca77106b5f8.socket --brick-name /bricks/sdb1/ms2_devel -l /var/log/glusterfs/bricks/bricks-sdb1-ms2_devel.log --xlator-option *-posix.glusterd-uuid=b6854102-97d8-41f8-8cbc-92a2a2f93334 --brick-port 49152 --xlator-option ms2_devel-server.listen-port=49152
vagrant  21470  0.0  0.4 150756  9148 pts/6    S+   17:59   0:00 vim .
```


## その後

- いい感じにプロセスの結果パースしてくれるの無いかなって探してみたら、見事にありました

https://github.com/djberg96/sys-proctable


- 以下のようにすると消費メモリtop10の情報を拾ってくる

```rb
> require 'sys/proctable'
> Sys::ProcTable.ps.sort_by!(&:rss).reverse.first(10)
# => 
=> [#<struct Struct::ProcTableStruct
  cmdline="spring app    | ikemen-rails-app | started 1 hour ago | development mode",
  cwd="/home/vagrant/github/ncb-mds",
  environ=
   {"RBENV_VERSION"=>"2.2.2",
    "HOSTNAME"=>"jector",
    "SHELL"=>"/bin/bash",
    "TERM"=>"screen",
    "HISTSIZE"=>"1000",
    "MAILCATCHER"=>"1",
    "SSH_CLIENT"=>"10.0.2.2 58800 22",
    "SSH_TTY"=>"/dev/pts/0",
    "USER"=>"vagrant",
    "LS_COLORS"=>"rs",
    "RBENV_ROOT"=>"/usr/local/rbenv",
    "SSH_AUTH_SOCK"=>"/tmp/ssh-LztcP11344/agent.11344",
    "RBENV_HOOK_PATH"=>":/usr/local/rbenv/rbenv.d:/usr/local/etc/rbenv.d:/etc/rbenv.d:/usr/lib/rbenv/hooks",
    "TMUX"=>"/tmp/tmux-500/default,11439,0",
    "MAIL"=>"/var/spool/mail/vagrant",
    "MAVEN_HOME"=>"/usr/share/apache-maven",
    "PATH"=>
# （略）
```

## 余談

### unixコマンドにおける`respond_to?`的なやつ

- スクリプト作成してる時に副次的に知ったのですが、`require 'mkmf'`とかいうのをやって以下のようにすると、コマンドが実行可能か判断できます（`ikemen`コマンドなど存在するはずがない)
- 実行できないなら`nil`が返ってきます

```rb
> require 'mkmf'
> find_executable("ikemen")
checking for ikemen... no
=> nil

> find_executable("ls")
checking for ls... yes
=> "/bin/ls"
```

### このGemの作者について

https://github.com/djberg96

- やたらとWindows上で ruby を動かすことに熱意を燃やしている凄い人ですね ~~僕はやりたくない...~~