- ベストアンサー
psコマンドから出る値を取り出す方法
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したいのです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
数字を取り出すだけなら、出力を/\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かなあ。 その後は研究してみてください。:)
その他の回答 (3)
- Meddlesome
- ベストアンサー率39% (59/151)
いま、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で殺してますけど。
この表示結果は、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してください
- arika
- ベストアンサー率9% (18/186)
AWKを使えば簡単でないですか? PSの出力をAWKスクリプトに食わせてあげると PIDはわかるんではないかと思います。 UNIX使いでないので、詳しい人のフォローをお願いします。