LoginSignup
4
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-03-15

背景

  • 定点的にプロセスのメモリを観測したくなりまして。
  • 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 .

その後

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

  • 以下のようにすると消費メモリtop10の情報を拾ってくる
> 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が返ってきます
> require 'mkmf'
> find_executable("ikemen")
checking for ikemen... no
=> nil

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

このGemの作者について

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4