• ベストアンサー

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したいのです。

  • ss963
  • お礼率10% (2/20)
  • Perl
  • 回答数4
  • ありがとう数6

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

  • ベストアンサー
  • y_oku
  • ベストアンサー率62% (25/40)
回答No.3

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

いま、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で殺してますけど。

noname#271
noname#271
回答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してください

  • arika
  • ベストアンサー率9% (18/186)
回答No.1

AWKを使えば簡単でないですか? PSの出力をAWKスクリプトに食わせてあげると PIDはわかるんではないかと思います。 UNIX使いでないので、詳しい人のフォローをお願いします。

関連するQ&A

  • psコマンドについて

    CentOS6で、ps auxを実行した時、わからないことが3点あります。 PSコマンドにてssshの結果を取得しました 【結果】 USER  PID %CPU %MEM VSZ   RSS  TTY  STAT  START  TIME  COMMAND root   1010   0.0   0.0 1612  1172   ?  Ss    16:16    0:00  /usr/sbin/sshd 【質問】 1点目:STATに表示される、「Ss」について  二つSが付く、「Ss」の意味はどういうことなのでしょうか? 2点目:STATに表示される、「W」について  色々調べてみると、「スワップアウトしたプロセス」ということがわかるのですが  「スワップアウトしたプロセスとはどういうことなのでしょうか?」  データみたいにHDDに退避されたプロセス?ということなのでしょうか?  よって、処理速度が遅くなったりする? 3点目:TTYの「?」について  制御端末がない場合のプロセスが、 ?でが出力される。  ということはわかったのですが、このsshdは自動起動設定にしているため  「?」になったのでしょうか? ご教授お願いします。

  • CPU 使用率について(ps,top,sar)

     "ps -aux"コマンドを利用したスクリプトを作成し、CPU 使用率を定期的に監視するようにしています。 先日、このスクリプトで CPU 使用率 99% を示す異常がありましたが、同じタイミングで top や sar を 試したところ、CPU 使用率は 1% もありませんでした。 異常があった時の ps -aux の取得結果は以下の通りです。 USER   PID %CPU %MEM VSZ RSS TTY STAT START  TIME COMMAND root    7 99.9  0.0  0  0  ?  SW Jul23 272:54 [kscand/Normal] ※等幅フォントだと見易いです kscand で CPU を 99.9% 消費しているように見えるのですが、top や sar コマンドの CPU 使用率は いずれも 1% 未満でした。またサーバの動作自体は軽快で、とても CPU を使い切っているようには 思えませんでした。 この事から ps コマンドの異常か何かだと思うのですが、ps と top や sar で取得する CPU 使用率の値に どの様な違いがあるのでしょうか。また、取得する値についてそれぞれ信頼性はあるのでしょうか。 ご存知の方いらっしゃいましたらご教示の程お願いします。 ■バージョン OS:Redhat Linux 9 (Shrike) procps version 2.0.11 sysstat version 4.0.7

  • killコマンドについてお教えください。

    solaris初心者です。 killコマンドで、 kill -TERM pidで終了できないプロセスについては kill -KILL pidで強制的に終了することができます。 と他の者に説明したら、どうして終了できないのが あるのですかと聞かれました。的確に回答できませんでしたので、よい説明方法等ありましたらお教えください。 あとkill -INT pidについてもお教えください。

  • CPU使用率取得方法について

    プロセス毎のCPU使用率を測定したいと思っています。 /proc/PID/statと/proc/statの両方のファイルの値で 算出可能でしょうか? 自分で考えたのは以下のような算出方法です。 ----------------------------------------- プロセスの実行時間(stime+utime) / システムのCP実行時間(user+sys+idel)をあるモニタ間隔で取得し、その差分から算出。 ----------------------------------------- topコマンドの中身も見てみましたが、プロセス毎の 算出方法は解りませんでした。 算出方法等お解りの方がいらっしゃいましたら、ご教授下さい。 ※ topコマンドからの直接の取得というのは今回は避けたいです。 ( 結果は同じだとしても。。)

  • PIDではなくプロセス名を指定してkillする方法

    PIDではなくプロセス名を指定してkillする方法 皆さんこんにちは。 Linuxで使うkillコマンドに関して教えてほしいことがあります。 killを使う際は、 killの後ろにPIDを指定してkillを実行していましたが、 PIDではなくプロセス名を指定して、 該当するプロセスを一度に終了させる方法はあるでしょうか。 宜しくお願い致します。 OS:Fedora9

  • javaのプロセス起動について

    UNIXで例えば以下のようなコマンドでjavaのプロセスを停止するとします。 ps -eo pid,comm | awk '$2=="java" {print "kill -9" $1}' 逆にjavaのプロセスをコマンドで起動する方法はありますか?

  • unixのサーバー管理

    unix のプロセス管理で プロセスの状態 stat がゾンビ以外でkillするべきものがいまいちわからないです。stat が D とか T とか S はそのままでいいのでしょうか?

  • サーバーで公開しているページがなかなか表示されない

    レンタルサーバーでWEBサイトをいくつか公開してるのですが、 最近、時間はまちまちなのですが 急に公開しているページが、なかなか表示されなかったり タイムアウトでサイトにつながらなくなってしまいます。 原因をしらべたいのですが 何から調べるのがいいのかわからなく困っています。 サーバーの方からメールで繋がらなくころのTOPコマンド内容がくるのですが、何かこの内容からわかる部分とかあるでしょうか? すいませんが、 もしなにかわかるようなところがありましたらよろしくお願いします。 heavy loaded. process (220) : 111 load (5) : 5.78, 7.22, 6.84 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND apache 4814 2.9 26.3 350456 272288 ? D 04:45 0:56 /usr/sbin/httpd apache 4813 2.0 31.6 424168 326876 ? D 04:45 0:38 /usr/sbin/httpd apache 4071 0.9 0.3 19916 4036 ? S 03:58 0:45 /usr/sbin/httpd apache 4327 0.9 0.3 19836 3796 ? S 04:13 0:37 /usr/sbin/httpd apache 3740 0.8 24.5 332128 253488 ? D 03:44 0:49 /usr/sbin/httpd apache 4006 0.8 0.3 19880 3952 ? S 03:54 0:42 /usr/sbin/httpd apache 4815 0.5 0.3 19848 3880 ? S 04:45 0:09 /usr/sbin/httpd apache 3711 0.3 0.3 19844 4044 ? S 03:44 0:18 /usr/sbin/httpd apache 4325 0.3 0.4 19904 5120 ? S 04:13 0:12 /usr/sbin/httpd apache 4328 0.3 0.3 19816 4004 ? S 04:13 0:12 /usr/sbin/httpd 。。。。

  • topコマンドの表示内容について教えてください

    topコマンドの表示内容に詳しい方、教えてください。 topコマンドを実行すると以下のように表示されました。 top - 16:24:13 up 2:23, 1 user, load average: 0.02, 0.01, 0.00 Tasks: 58 total, 1 running, 57 sleeping, 0 stopped, 0 zombie Cpu(s): 3.3% us, 2.0% sy, 0.0% ni, 94.7% id, 0.0% wa, 0.0% hi, 0.0% si Mem: 3114724k total, 770612k used, 2344112k free, 18352k buffers Swap: 2096472k total, 0k used, 2096472k free, 87468k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2976 root 18 0 748m 613m 3188 S 10 20.2 6:53.72 aaaaa 1 root 16 0 1724 552 472 S 0 0.0 0:00.70 init 上記aaaaaプロセスの%CPUの数値なのですが、10%となっています。 しかし、idleが94.7%あるようなのです。 この10%と言う値は、何に対する10%なのでしょうか? すいませんが分かる方、よろしくお願いします。

  • スクリプト中に日本語を表示させたい。

    現在top監視スクリプト作成中なのですが、内容に日本語を 含めたくとも文字化けしてしまいます。 #!/bin/sh AVE=`uptime | sed 's/[.,]//g' | awk '{print $(NF-2)}'` if [ $AVE -gt 100 ];then echo "`date +%m/%d/%a/;` `uptime`" >> ./top.$$ top -b -n1 |awk '{if((5>=NR)&&(2<=NR)){print}}' >> ./top.$$ echo ----------------------------------------------------------------------------- >> ./top.$$ printf "USER PID %%CPU %%MEM VSZ RSS TTY STAT START TIME COMMAND\n" >> ./top.$$ ps aux |sort +4r |head -10 >> ./top.$$  >> ./top.$$ CPU負荷平均率が$AVEを超えました。 >> ./top.$$ fi 文字コードを指定するnkfを試しても文字化けは変わらず。 どうしたら文字化けせずにログを保存できますでしょうか