私が手に入れたすべてのプロセスを強制終了したいのですが。
ps aux | grep my_pattern
どうやってするの?
これは動作しません:
pkill my_pattern
pkill -f
を使用します。これは、コマンドラインの任意の部分のパターンと一致します。
pkill -f my_pattern
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
このコードは何をしているのですか?
ps -ef
は、このユーザーに見えるコンピュータ上のプロセスIDのリストを作成します。パイプgrepは、その文字列を含む行に対してそれをフィルタリングします。 grep -v grep
は、グリップを行っているプロセス自体とは一致しないと言っています。 pipe awk printは、デフォルトの区切り文字の空白で行を分割し、私たちのプロセスIDである2番目の列にフィルタをかけると言っています。パイプxargsは、それらすべてのpidをkill -9
に送信するための新しいプロセスをスピンアップし、それらをすべて終了します。
上記のコードは、いくつかの理由で悪く、危険で、見苦しく、そしてハッキングです。
強制終了されるコードが、低い確率の競合条件でデータベース操作または安全なトランザクションを実行している場合、何パーセントかの時間割合で、そのトランザクションの原子性が破壊され、未定義の動作が発生します。 kill -9は囚人を連れて行きません。あなたのコードがこれに敏感な場合は、xargs kill
の部分をグレースフルシャットダウンを要求する送信済みフラグに置き換えてみてください。その要求が拒否された場合にのみ、最後にkill -9
を使ってください。
ps -ef
は存在する可能性のあるすべてのプロセスをリストしているため、オペレーティングシステムを誤って終了させたり、無関係なプロセスで未定義の動作を引き起こしたりする可能性があります。あなたのプロセス名、あるいはread-killからkill -9までの間にprocessidが他のものに変更されたため、意図しないランダムなプロセスを誤って終了しました。
しかし、 非常にユニークな名前でリスクとコントロールを理解していて、トランザクションがいくつかドロップされたりデータが壊れたりすることがあっても問題ない場合は、99.9%の時間で問題ありません。問題がある場合は、コンピュータを再起動し、プロセスの衝突がないことを確認してください。これは、テクニカルサポートスクリプト「コンピュータを再起動してみましたか」をレベル5ミームにする、このようなコードが原因です。
より柔軟にプロセスを選択する必要がある場合
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
Grep -eなどを使うことができます。
次のコマンドを使ってプロセスを一覧表示できます。
ps aux | grep -c myProcessName
あなたがそのプロセスの数をチェックする必要があるならば、実行してください
ps aux | grep -c myProcessName |grep -v grep
その後、を使用してプロセスを強制終了できます。
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
killall -r my_pattern
も使えます。-r
プロセス名のパターンを拡張正規表現として解釈します。
killall -r my_pattern
あなたがpkill -f PATTERN
を少し危険すぎると判断した場合、私は ezkill bashスクリプトを書きました。
プロセスIDを見つけるのが面倒な場合は、正規表現を使用して名前でプロセスを強制終了します。たとえば、chromeを強制終了するには、次のコードが役立ちます。
killall -r --regexp chrome
次のコマンドを使うと
kill -9 $(ps aux | grep 'process' | grep -v 'grep' | 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`
' pkill 'をサポートしていないサーバーでそれを実行するための最良の方法を見つけました
" kill -9 $(ps ax | grep My_pattern | fgrep -v grep | awk '{print $ 1}') "
ループする必要はありません。
kill
と一緒にpgrep -f
を使用するのが最善かつ最も安全です、または単にpkill -f
、grep
ing ps
の出力が間違ってしまう可能性があります。
ps | grep
を追加したりパターントリックを使用したりしてgrep行を除外する必要がある| grep -v
を使用するのとは異なり、pgrep
は意図的に選択されることはありません。
さらに、パターンがps
のUID
/USER
、SDATE
/START
、またはその他の列に表示された場合、不要なプロセスが出力に表示されます。殺してください、pgrep
+ pkill
この欠陥に苦しんではいけません。
また、私はkillall -r
/-regexp
が私の正規表現ではうまくいかないことを発見しました。
pkill -f "^python3 path/to/my_script$"