次のプロセスを使用して終了したいと思います。
pkill "run_tcp_sender.sh"
または
pkill -SIGKILL "run_tcp_sender.sh"
root 14320 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14323 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14325 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14327 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14328 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14330 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
しかし、プロセスはまだ役に立たない。私のコマンドに何の問題がありますか?
注:次のコマンドを使用して必要なものを取得できます。
kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}')
答え1
pkill
デフォルトでは、SIGTERM
停止信号がプロセスに送信されます。以下は、プロセスに送信できる信号のリストです。通常、名前または番号で送信できます。
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
したがって、信号#15を送信しようとしています。プロセスがこの信号に応答しない場合は、信号#9を使用する必要がありますpkill -SIGKILL
。
~からpkill のマニュアルページ:
- 信号
Defines the signal to send to each matched process. Either the numeric or the symbolic signal name can be used. (pkill only.)
pkillの問題
OPは自分が仕事をすることができなかったと言いましたpkill -SIGKILL "run_tcp"
。最初は、この問題はpkill
すべての "run_tcp"プロセスを終了する前に潜在的に自己終了することに関連していると思いました。
しかし、マニュアルページの脚注を見ると、これは受け付けにくいですpkill
。
実行中のpgrepまたはpkillプロセスは、自分自身を一致として報告しません。
それ以外に@Gillesが残したコメントはpkill
自殺しないということを除いては基本的に同じことを言いました。それから彼は実際に何が起こっているのかについて非常に重要な手がかりを与えました。
以下は、OPと自分が何を見逃しているかを示す例です。
ステップ1 - sleepy.bashスクリプトを作成する
#!/bin/bash
sleep 10000
ステップ2 - 偽の睡眠作業のロード
$ for i in `seq 1 5`;do bash sleepy.bash & done
[1] 12703
[2] 12704
[3] 12705
[4] 12706
[5] 12707
ステップ3 - 実行中のジョブを確認する
$ ps -eaf|egrep "sleep 10000|sleepy"
saml 12703 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12704 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12705 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12706 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12707 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12708 12704 0 21:48 pts/16 00:00:00 sleep 10000
saml 12709 12707 0 21:48 pts/16 00:00:00 sleep 10000
saml 12710 12705 0 21:48 pts/16 00:00:00 sleep 10000
saml 12711 12703 0 21:48 pts/16 00:00:00 sleep 10000
saml 12712 12706 0 21:48 pts/16 00:00:00 sleep 10000
ステップ4 - 私のpkillを試してください。
$ pkill -SIGTERM sleepy.bash
ステップ5 - 何が起こりましたか?
ps
上記のコマンドを実行すると、OP質問と同様にプロセスが終了しないことがわかります。どうなりますか?
その結果、これがpkill
.commandを使ってみた方法です。
pkill -SIGTERM "sleepy.bash"
名前が人を探しています。「眠い。bash」。まあ、同じ名前のプロセスはありません。というプロセスがあります。「バッシュ doze.bash」しかし。したがって、pkill
終了するプロセスを探していますが、何も見つからず終了します。
したがって、私たちpkill
が使用するものを少し調整すると、次のようになります。
$ pkill -SIGTERM -f "sleepy.bash"
[1] Terminated bash sleepy.bash
[2] Terminated bash sleepy.bash
[3] Terminated bash sleepy.bash
[4]- Terminated bash sleepy.bash
[5]+ Terminated bash sleepy.bash
今望む効果を得た。違いは何ですか?一致時にプロセス名の代わりに完全なコマンドラインパスを使用する-f
スイッチを使用しましたpkill
。pkill
pkill のマニュアルページから
-f The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
代替方法
殺す、PS
この方法は非常に冗長ですが、作業は完了です。
kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}')
pkillとKillallを含むpgrep
pgrep
代わりに、PIDリストを提供またはpkill
使用できますkillall
。
はい
# pgrep solution
$ pgrep "run_tcp" | pkill -SIGKILL
# killall
killall -SIGKILL -r run_tcp
引用する
答え2
これは親プロセスIDとは何の関係もありません。問題は、単に実行中のすべてのプロセスを終了しますrun_tcp_sender.sh
が、そのようなプロセスがないことです。興味のあるプロセスが実行中ですbash
。
pkill
コマンドライン全体で一致が発生するように指示できます。
pkill -f '^bash run_tcp_sender.sh'
別のアプローチは、スクリプトが開いているすべてのプロセスを終了することです。これにより、スクリプトを開いたばかりのエディタが破損するなど、付随的な破損が発生する可能性があります。
fuser -k /path/to/run_tcp_sender.sh
スクリプトを root として編集しない限り、root プロセスを終了すると問題が解決します。
kill $(lsof -uroot /path/to/run_tcp_sender.sh)
答え3
以下のコマンドはシンプルで、私にとって完璧に動作します!上記の提案は機能しないか、非効率的です(複雑すぎる)。
kill -9 $(pgrep -f somepattern)
kill コマンドを実行する前に、どのプロセスが一致しているかを確認することをお勧めします。
pgrep -af somepattern
答え4
「信号9」でプロセスを終了してみてください。
kill -9 PID
通常、シグナル9を使用してデータベースエンジンをシャットダウンすることはお勧めできません。
プロセスがメモリに残っている場合は、一部のI / Oが見つからないか、プロセスがI / Oが完了するのを待っています。