web-dev-qa-db-ja.com

LinuxでプロセスIDを取得するシェルスクリプト

シェルスクリプト(.sh file)指定されたプロセスIDを取得します。ここでやろうとしているのは、プロセスIDを取得したら、そのプロセスを強制終了することです。 Ubuntu(Linux)で実行しています。

私は次のようなコマンドでそれを行うことができました

ps -aux|grep Ruby
kill -9 <pid>

しかし、シェルスクリプトを使用してそれを行う方法はわかりません。

27
sameera207

grepの結果にpsを使用することは、スクリプトの悪い考えです。これは、呼び出したばかりのgrepプロセスにも時間の一部が一致するためです。コマンド pgrep はこの問題を回避するので、プロセスIDを知る必要がある場合は、これがより良いオプションです。 (もちろん、多くのプロセスが一致する可能性があることに注意してください。)

ただし、この例では、同様のコマンドpkillを使用して、一致するすべてのプロセスを強制終了できます。

pkill Ruby

ちなみに、ほとんどの場合、-9の使用はやり過ぎ(ho ho)であることに注意する必要があります。「kill -9書式文字の無用な使用」のテキストには、それに関する有用なアドバイスがあります:

ダメダメダメ。 kill -9を使用しないでください。

プロセスにきれいな機会を与えません:

  1. ソケット接続をシャットダウンする
  2. 一時ファイルをクリーンアップします
  3. それがなくなることをその子供に通知します
  4. その端末特性をリセットします

などなど。

通常、15を送信し、1〜2秒間待機し、それが機能しない場合は2を送信し、それが機能しない場合は1を送信します。それが機能しない場合、プログラムの動作が悪いためバイナリを削除します!

kill -9を使用しないでください。植木鉢を整頓するためだけにコンバインハーベスターを持ち出さないでください。

36
Mark Longair

psgrepを使用する場合は、次のようにする必要があります。

ps aux|grep r[u]by

これらの角括弧により、grepはgrepコマンド自体の行をスキップします。スクリプトでこれを使用するには、次のようにします。

output=`ps aux|grep r\[u\]by`
set -- $output
pid=$2
kill $pid
sleep 2
kill -9 $pid >/dev/null 2>&1

バックティックを使用すると、コマンドの出力をシェル変数にキャプチャできます。 set --はps出力をワードに解析し、$ 2は行の2番目のワードであり、偶然pidになります。次に、TERMシグナルを送信し、Rubyになるまで数秒待ってからシャットダウンし、それが存在する場合は容赦なくそれを強制終了しますが、ほとんどの場合は強制終了するため出力を破棄します- 9は、プロセスがすでに死んでいると文句を言うでしょう。

私は角括弧の前にバックスラッシュなしでこれを使用したことを知っていますが、ちょうど今Ubuntu 12でそれをチェックしました、そしてそれはそれらを必要とするようです。これはおそらく、bashの多くのオプションと、さまざまなLinuxディストリビューションのデフォルト構成に関係しています。 []と[]がどこでも機能することを願っていますが、バックスラッシュなしで機能することがわかっているサーバーにアクセスできなくなっているため、確信が持てません。

1つのコメントはgrep-vを示唆しており、それが私がかつて行ったことでしたが、[]バリアントを知ったとき、パイプラインで1つ少ないプロセスを生成する方が良いと判断しました。

18
Michael Dillon

最初はps -aux | grep...を実行する必要はありません。コマンドpidofを使用する方がはるかに優れています。そして、ほとんどないkill -9参照 ここ

bashのコマンドから出力を取得するには、次のようなものを使用します

pid=$(pidof Ruby)

または、pkillを直接使用します。

6
Fredrik Pihl

オプション-v はとても重要です。 grep式自体を除外できます

例えば.

ps -w | grep sshd | grep -v grep | awk '{print $1}' to get sshd id
4
user2223691

これはCygwinで機能しますが、Linuxでも有効であるはずです。

ps -W | awk '/Ruby/,NF=1' | xargs kill -f

または

ps -W | awk '$0~z,NF=1' z=Ruby | xargs kill -f

バッシュの落とし穴

3
Steven Penny

コマンド killall を使用できます。

$ killall Ruby
2
Francisco R

とても簡単です。このようなプログラムを実行するだけです:-x = gedit&echo $!これにより、このプロセスのPIDが得られます。その後、このキル-9 $ xを行います

0
abhishekrana