-PR-
解決済み

psコマンドから出る値を取り出す方法

  • 困ってます
  • 質問No.30121
  • 閲覧数550
  • ありがとう数6
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 10% (2/20)

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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル8

ベストアンサー率 62% (25/40)

数字を取り出すだけなら、出力を/\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件)

  • 回答No.1
レベル10

ベストアンサー率 9% (18/186)

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

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


  • 回答No.2

この表示結果は、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してください
  • 回答No.4
レベル10

ベストアンサー率 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で殺してますけど。
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-

特集


抽選で合計100名様にプレゼント!

ピックアップ

ページ先頭へ