プロが教えるわが家の防犯対策術!

psコマンド(UNIX)から出る値は

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME
au  21482 2.6  1.2  4004 3228 ?   S    19:08  0:00

という風に、いくつかのスペースで区切られてます。

これらの数字を取り出すには、どうしたらよいですか。

具体的には、暴走したプロセスを自動的にkill出来るようにしたいのです。

ユーザーが実行しているcpuの値を取り出して、一定数以上の場合、そのPIDを取り出してkillしたいのです。

A 回答 (4件)

AWKを使えば簡単でないですか?


PSの出力をAWKスクリプトに食わせてあげると
PIDはわかるんではないかと思います。

UNIX使いでないので、詳しい人のフォローをお願いします。
    • good
    • 0

この表示結果は、psコマンドではないですね?


topですか?

UNIXだけではよくわかりません
商用のUNIXにも
Solaris
HP-UX
などいろいろとあります。

ちょっときついようかも知れませんが
何をもってプログラムが暴走したと判断するんでしょうか?

CPU Timeですか?
普通は、

ps -ef | grep xxx | grep -v grep

等を行い結果をファイルに出力してから、
shell(awk も含む) or pealなどを使って処理するのが一般的だと思います。

pealはちょっと知らないのですが
#Solarisは標準では入っていなかったような

awkなら

ps -ef | grep xxx | grep -v grep | awk '{ printf $2 }'

とすることでPIDが表示されると思いますので
後は、自分で処理を考えてください。

#これは、プロセスが1つの場合に有効です
#複数ある場合は、ファイルに出力してから
#1つずつプロセスをkillしてください
    • good
    • 0

数字を取り出すだけなら、出力を/\s+/でsplitすればよいのでは。


質問の出力に合わせて書くのなら、

test.pl
-------------------------------------------------------
$head = <>;# 一行目読み捨て。
while(<>){
@arr = split(/\s+/, $_);

print "USER: $arr[0]\n";
print "PID: $arr[1]\n";
print "START: $arr[8]\n";
}
-------------------------------------------------------
のようなPerlスクリプトに
ps -u | perl test.pl
とパイプでpsの出力を食わせるようにします。
どのUnixだろう。FreeBSDかなあ。

その後は研究してみてください。:)
    • good
    • 0

いま、Linux環境でないため確認できませんが、


psって、
USER  PID %CPU %MEM VSZ RSS TTY STAT START TIME
[%5s] [%5d] .....

てなぐあいにフォーマットが決まったような。


$ps_data = <DATA>;
$usr = substr($ps_data,0,5);
$pid = substr($ps_data,8,5);
$cpu = substr($ps_data,15,5);
if(条件){
system("kill -9 $pid");
}
しょぼいプログラムですが、こんな感じで良いでしょうか?

う~ん、今、実際にこのプログラムを実行できないから不安です(汗)
自分が実行したものだけにじっこうするならgetuidを使って比較してやっても良いでしょう。

しかし、CPUの値から暴走と判断するのは大変危険な気もしないではないですが。
僕は、作成中のプログラムにgetpidでPIDをファイルに吐かせて、
暴走した場合は(あくまでも自分で暴走したか判断しています。無限ループとか・・・プログラムが^Cでも終了できないような仕様になってるので・・・)、PIDがかかれているファイルをひろってsystemで殺してますけど。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!