回答:
pkill -f
コマンドラインの任意の部分のパターンに一致するを使用します
pkill -f my_pattern
pkill
た。最もよくある間違いは、各バイナリのインスタンスは常に1つしか存在できないという仮定でした。
killall -m my_pattern
です。
pgrep
最初にを使用して、何を殺すか確認することをお勧めします。を使用pgrep -l
して、プロセス名pgrep -a
を表示したり、完全なコマンドラインを表示したりできます。pkillと同じフラグを使用します。したがって、この場合はを使用できますpgrep -fa my_pattern
。
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
ソース:http : //www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9
このコードは何をしていますか?
ps -ef
このユーザーには見えコンピュータ上でプロセスIDのリストを生成します。pipe grepは、その文字列を含む行をフィルタリングします。grep -v grep
grepをを行うプロセス自体に一致していないと言います。パイプのawk印刷では、デフォルトの区切り文字の空白で行を分割し、プロセスIDである2番目の列にフィルターをかけます。パイプxargsは、すべてのpidを送信する新しいプロセスを起動しますkill -9
すべてを終了します。
上記のコードは、いくつかの理由で、悪い、危険、醜い、ハックです。
強制終了されるコードがデータベース操作または安全なトランザクションを低確率の競合状態で実行している場合、時間の一部の割合で、そのトランザクションのアトミック性が破壊され、未定義の動作が発生します。kill -9は囚人を連れて行かない。コードがこれに敏感な場合はxargs kill
、正常なシャットダウンを要求する送信済みフラグでパーツを置き換えてみてください。その要求が拒否された場合にのみ、最後の手段としてkill -9
オペレーティングシステムを誤って終了したり、無関係なプロセスで未定義の動作を引き起こしたりして、ps -ef
存在する可能性のあるすべてのプロセスがリストされ、システム全体が不安定になる可能性があります。プロセス名、またはreadとexecute kill -9の間の時間に、プロセスIDが別の何かに変更され、意図しないいくつかのランダムプロセスが誤って終了しました。
しかし、非常にユニークな名前でそれらのリスクと制御を理解し、いくつかのトランザクションの削除またはデータの偶発的な破損に問題がなければ、99.9%の時間で問題ありません。問題がある場合は、コンピューターを再起動し、プロセスの競合がないことを確認します。これは、テクニカルサポートスクリプトが「コンピュータを再起動してみましたか」というレベル5のミームになっているためです。
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
引数を指定しない場合は、コマンドを実行していないxargsのを持っています。
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
引用符がないと、最初の実行でバックグラウンドプロセスの1つだけが強制終了されました。もう一度実行すると、残りが殺されました。
-r
オプションはOS Xには存在しないので、そうです。
プロセスの選択にさらに柔軟性が必要な場合は、
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
grep -eなどを使用できます。
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(リファクタリングにも注意してください。@ synthesizerpatelの回答に関する私のコメントも参照してください)。
ps
が3つのプロセス123、234、および345を返す場合は、kill 123 234 345
同じように、rm
またはcat
複数のファイル引数を使用できます。
grep
for KILLPID in
ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
はgrepを削除します
次のコマンドを使用してプロセスを一覧表示できます
ps aux | grep -c myProcessName
そのプロセスの数を確認する必要がある場合は、実行します
ps aux | grep -c myProcessName |grep -v grep
その後、あなたは使用してプロセスを殺すことができます
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
次のコマンドを使用して、次のことができます。
ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9
または
ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9
わたしにはできる。
音が悪い?
pkill `pidof myprocess`
例:
# kill all java processes
pkill `pidof java`
それは使用するのが最善と最も安全だpgrep -f
とkill
、あるいは単にpkill -f
、grep
INGのps
の出力が間違って行くことができます。
パターントリックをps | grep
追加| grep -v
または使用してgrep行をフィルターで除外する必要があるとは異なりpgrep
、仕様で選択するだけではありません。
また、あなたのパターンはに表示されるはずps
のUID
/ USER
、SDATE
/ START
または他の列、あなたは、出力に不要なプロセスを取得し、それらを殺しますpgrep
+pkill
この欠陥に悩まされません。
また、私の正規表現ではkillall -r
/ -regexp
が機能しないこともわかりました。
pkill -f "^python3 path/to/my_script$"
私はオイゲンリーエックの答えを受け取り、それを使って作業しました。私のコードは以下を追加します:
ps ax
grepを含むので、私はそれを除外しました grep -Eiv 'grep'
私はそれという名前のファイルを作成しましたkillserver
、ここにそれは行きます:
#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
if [ ! -z $KILLPID ];then
kill -9 $KILLPID
echo "Killed PID ${KILLPID}"
KILLED=yes
fi
done
if [ -z $KILLED ];then
echo "Didn't kill anything"
fi
結果
➜ myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
➜ myapp git:(master) bash killserver
Didn't kill anything
my_pattern
、単に名前のストリング、またはそれは任意の正規表現の特殊文字が含まれているのですか?