で、どのジョブが終わっている(落ちている)か、走行中かを確認することがあります。
もし、同名のジョブを複数実行している場合、top や ps では区別が付きません。
たとえば、top したときに一番右のカラムが全部 ./a.out とかになってしまいます。
バイナリの名前や引数をジョブごとに変更すれば
区別が付くようになりますが、いちいちやってられません。
で、どうするかというと、ここでは
ファイル /proc/(pid)/cwd がプロセス番号 pid のジョブが走っているディレクトリへの
シンボリックリンクになっていることを利用します。
少なくとも私の場合、同じディレクトリ内で同時並行にジョブを
走らせることはなく、実行ディレクトリのパスは必ず違うからです。
シンボリックリンクの中身を ls -l などでいちいり覗くのは面倒くさいので、
「自分が実行している」「CPU 利用率の高い」ジョブの
実行ディレクトリの一覧を出すようにしたのが以下の Ruby スクリプトです。
勝手に lsrun と名付けました。
#!/usr/bin/env ruby
# これより CPU 使用率が高いプロセスだけ表示
THRE_CPU_USAGE = 10.0
username = ENV['USER']
myprocs = `ps aux | grep #{username}`.split("\n").map{|line| line.split(" ")}
myprocs.each{|proc|
cpu_usage = proc[2].to_f
if cpu_usage > THRE_CPU_USAGE then
pid = proc[1].to_s
command = proc[10..-1].join(" ").to_s
cwd = File.readlink("/proc/#{pid}/cwd")
# puts [pid, cpu_usage.to_s, command, cwd].join(" ") # 1 行で表示したいとき
pid = sprintf("%5i", pid.to_i)
puts [pid+" "+cpu_usage.to_s, " "+command, " "+cwd].join("\n")
end
}
実行結果はこのようになります。
12345 99.9 ./a.out /home/username/work/exp01 23456 99.8 ./a.out /home/username/work/exp02
前から順に、pid、CPU 使用率、実行コマンド(引数がある場合はそれも含む)、実行ディレクトリ、です。
私は見やすさのためにこういう出力形式にしましたが、
1ジョブを1行で出力したい場合は
if ~ end の中にあるコメントアウトを外して、
その後ろ2行を削除してください。
0 件のコメント:
コメントを投稿