私はしばしばプログラミング中にプロセスを強制終了する必要があります。
私は今それをする方法は次のとおりです。
[~]$ ps aux | grep 'python csp_build.py'
user 5124 1.0 0.3 214588 13852 pts/4 Sl+ 11:19 0:00 python csp_build.py
user 5373 0.0 0.0 8096 960 pts/6 S+ 11:20 0:00 grep python csp_build.py
[~]$ kill 5124
どうすればプロセスIDを自動的に抽出して同じ行で強制終了することができますか?
このような:
[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
bash
では、次のことができるはずです。
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
動作の詳細は次のとおりです。
ps
は、すべてのプロセスのリストを提供します。grep
フィルターは、検索文字列に基づいて、[p]
が実際のgrep
プロセス自体の取得を停止するためのトリックです。awk
は、PIDである各行の2番目のフィールドを提供します。$(x)
構文は、x
を実行し、その出力を取得してコマンドラインに配置することを意味します。上記のコンストラクト内のps
パイプラインの出力はプロセスIDのリストなので、kill 1234 1122 7654
のようなコマンドになります。動作中のスクリプトを次に示します。
pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+ Terminated sleep 3600
[1] Terminated sleep 3600
[2] Terminated sleep 3600
[3]- Terminated sleep 3600
[4]+ Terminated sleep 3600
そして、あなたはそれがすべての枕木を終わらせるのを見ることができます。
grep '[p]ython csp_build.py'
ビットをもう少し詳しく説明します。
sleep 3600 &
に続いてps -ef | grep sleep
を実行すると、twoプロセスにsleep
、sleep 3600
およびgrep sleep
が含まれる傾向があります(両方にsleep
が含まれているため、そうではありません)ロケット科学)。
ただし、ps -ef | grep '[s]leep'
はsleep
を含むプロセスを作成せず、代わりにgrep '[s]leep'
を作成します。ここで注意が必要なのは、grep
が「すべての文字からの正規表現を探しているため、文字クラス[s]
(s
)の後にleep
が続きます。
つまり、sleep
を探していますが、grepプロセスはgrep '[s]leep'
であり、sleep
が含まれていません。
私がこれを見せられたとき(SOの誰かによって)、私はすぐにそれを使い始めました
| grep -v grep
を追加するよりも1つ少ないプロセスです。そしてあなたがpkillを持っているなら、
pkill -f csp_build.py
(完全な引数リストではなく)プロセス名に対してのみgrepしたい場合は、-f
を省略してください。
ps aux | grep -i csp_build | awk '{print $2}' | xargs Sudo kill -9
awk '{print $2}'
Sudo
はオプションですkill -9 5124
、kill -9 5373
などを実行します(kill -15はより優雅ですが、少し遅くなります)。私は私の.bash_profileで定義された2つのショートカット関数も持っています(〜/ .bash_profileはosx用です、あなたはあなたの* nixマシンで何がうまくいくかを見なければなりません)。
p csp_build
、p python
などbash_profileコード:
# FIND PROCESS
function p(){
ps aux | grep -i $1 | grep -v grep
}
ka csp_build
、ka python
などka csp_build 15
、ka python 9
)bash_profileコード:
# KILL ALL
function ka(){
cnt=$( p $1 | wc -l) # total count of processes found
klevel=${2:-15} # kill level, defaults to 15 if argument 2 is empty
echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
p $1
echo -e '\nTerminating' $cnt 'processes .. '
ps aux | grep -i $1 | grep -v grep | awk '{print $2}' | xargs Sudo kill -klevel
echo -e "Done!\n"
echo "Running search again:"
p "$1"
echo -e "\n"
}
使ってみる
ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
killall -r regexp
-r, --regexp
プロセス名パターンを拡張正規表現として解釈します。
正規表現プロセスの強制終了にはpkill '^python*'
のみを使用できます。
あなたがあなたがあなたが殺すか殺す前に見つけるつもりを見たいならばちょうどpgrep -l '^python*'
を使用してください-lはプロセスの名前も出力します。 pkill
を使用したくない場合は、単に次のように使用します。
pgrep '^python*' | xargs kill
Pgrepを使う - 多くのプラットフォームで利用可能です。
kill -9 `pgrep -f cps_build`
pgrep -fは、 "cps_build"と一致するすべてのPIDを返します。
キーワードmidori
でプロセスを強制終了するには、例えば:
kill -SIGTERM $(pgrep -i midori)
あなたはawkとbackticsでそれをすることができます
ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`
awkの$ 2は2列目を印刷し、backticsは印刷されたステートメントを実行します。
しかし、もっときれいな解決策は、pythonプロセスがそのプロセスIDを/ var/runに保存することです。そうすれば、単純にそのファイルを読んでそれをkillすることができます。
私の仕事は、特定のディレクトリに置かれている正規表現にマッチするものすべてを削除することでした(Seleniumのテストの結果、すべてが停止したわけではありません)。これは私のために働いた:
for i in `ps aux | egrep "firefox|chrome|Selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
awk
(およびps
)のみを使用するメソッド
ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'
文字列等価性テストを使用することで、このプロセス自体のマッチングを妨げます。
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
Pkillに-fを与える
pkill -f /usr/local/bin/fritzcap.py
.pyファイルの正確なパスは
# ps ax | grep fritzcap.py
3076 pts/1 Sl 0:00 python -u /usr/local/bin/fritzcap.py -c -d -m
私はこのようなものを使い始めました:
kill $(pgrep 'python csp_build.py')
いくつかのケースでは、私はこのようにプロセスを同時にkillしたいと思います。
➜〜1000と [1] 25410 1000〜1000と [2] 25415 [ スリー〜1000と [3] ] 25421 Pidof sleep 25421 25415 25410 D [pidof sleep] [2] - 25415スリープを終了しました1000 [] 1] - 25410:スリープ終了1000 [3] + 25421:スリープ終了1000
しかし、私はそれがあなたの場合には少し不適切であると思います(バックグラウンドでpython a、python b、python x ...を実行しているかもしれません)。
共通の _ ppid _ から始めた私たち自身のプロセスを殺すことは非常に頻繁にあります、–P
フラグに関連する pkill は私にとって勝者です。 @ ghostdog74の使用例
# sleep 30 &
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$
[1] Terminated sleep 30
[2] Terminated sleep 30
[3]- Terminated sleep 30
[4]+ Terminated sleep 30
これはpidのみを返します
pgrep -f 'process_name'
だから一行で任意のプロセスを殺すために:
kill -9 $(pgrep -f 'process_name')
あるいは、プロセスの正確な名前がわかっていれば、pidofを試すこともできます。
kill -9 $(pidof 'process_name')
しかし、あなたがプロセスの正確な名前を知らないならば、pgrep
はより良いでしょう。
同じ名前で複数のプロセスが実行されていて、最初のプロセスを強制終了したい場合は、次のようにします。
kill -9 $(pgrep -f 'process_name' | head -1)
また、大文字と小文字の区別が心配な場合は、grepのように-iオプションを追加できます。例えば:
kill -9 $(pgrep -fi chrome)
man 7 signal
またはman signal
およびman pgrep
でのシグナルおよびpgrepに関する詳細情報
あなたはpsのためにユーザースイッチを必要としません。
kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`
gkill processname
を使用します。ここで、gkillは次のスクリプトです。
cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
echo "Found $cnt processes - killing them"
ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
echo "No processes found"
fi
注:コマンドラインに "grep"が含まれているプロセスは強制終了されません。
私はこれを使用して、スクリプトが暴走してcpu bashingしているときにFirefoxを殺します:) 'Firefox'をあなたが死にたいアプリケーションに置き換えます。私はBash Shellを使っています - OS X 10.9.3 Darwin。
kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)