プロセスが実行されている場合にのみ強制終了する方法は?


14

現在、shスクリプトファイルで次のような行を使用しています。

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

しかし、プロセス(myServerここ)が実行されている場合にのみ呼び出す方法を疑問に思いますか?


killテストと呼び出しの間に競合状態があるため、プロセスの実行中にのみ呼び出すことは不可能ですkill(その短時間でプロセスが別の理由で停止した可能性があります)。pkillまたはkillallを使用する必要がありますが、入力するのが少なくてすみます(おそらく他の利点もあります)。
JanC

回答:


20

私は通常pgrepとpkillを使用します

if pgrep myServer; then pkill myServer; fi

7
なぜpkill myServerkillall -q myServer?存在しないプロセスを殺そうとすることにはマイナス面はありません。
デビッドフォースター14年

12
強制終了するプロセスがない場合は0を終了しないため、スクリプトが破損する可能性があります。
boutch55555 14年

6
|| trueその後追加します。
デビッドフォースター14年

確かに、プロセスが既に終了していることを通知するために、他に追加する柔軟性はありません。
boutch55555 14年

どうif ! killall -q myServer; then echo ERROR; fi
デビッドフォースター14年

9

pkillまたはを使用して、名前でプロセスを強制終了できkillallます。それらのマニュアルページを確認してください。


はい、とは異なりkill、これはプロセスが実行されている場合にのみ強制終了します。例えばpkill -u myuser -f myprocess\.[0-9]+
チェイスT.

6

少し異なるアプローチは次のようになります。

killall PROCESS || echo "Process was not running."

これにより、プロセスが存在しない場合、コマンド1から返されるエラーコードが回避されkillallます。echo一部は場合にのみ、行動に来るkillall戻っ1自体が返されますが、0(成功)。


5
使用するとkillall -q良いです
アンワル

1
警告、killall -qすべてのUNIXフレーバーでサポートされているわけではありません。macOSCatalinaにはまだサポートされていません。
-tresf

0

使用してみてください:

sudo kill `pidof process_name`

process_nameは、強制終了するプロセスの名前です。これの素晴らしい点は、pidofが指定された名前に一致するすべてのプロセスのpidをリストすることです。killは複数のpidを受け入れるため、それらすべてを1つの気まぐれで殺します。

これが役立つかどうか教えてください。


リストが空の場合はどうなりますか?(私の主な目的は、可能な場合、killを呼び出すことではありませんでした)
-myWallJSON

1
リストが空の場合、killはエラーコード1を返し、何も強制終了しません。引数なしでkillを呼び出そうとするのと同じです。pidofが空のリストを返すかどうかを最初にチェックするifステートメントを追加できます。空のリストを返さない場合は、を呼び出しますkill `pidof process_name。空のリストを返す場合は、kill呼び出しをスキップします。
アマンディオン

0

R&Dで作成した小さなスクリプト。気に入っていただけるといいけど

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

script.shのような名前で保存してから

chmod +x script.sh
./script.sh

次に、プロセス名を付けます。

注:私はこれで何度も試しましたが、それでも問題ありません。


このスクリプトの何が問題なのか、そして-ve voteで説明が必要な場合があります。
rɑːdʒɑ

このスクリプトに問題はありません... +1
WinEunuuchs2Unix

0

でプロセスが存在するかどうかを確認しpidofます。もしそうなら、それを殺します:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

上記のコマンドを実行した後、終了コードは常に0です。


0

pkillオプションで使用-f

pkill -f myServer

オプション-fは、通常、プロセス名と照合されるパターンです。


-1

私は使うだろう:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

xargs -r入力がある場合にのみキルを実行するように指示します。ps --no-header -eo pid,cmd構文解析のためのより良い形式に出力を取得します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.