pkillは親プロセスID 1を使用してプロセスを終了できません。

pkillは親プロセスID 1を使用してプロセスを終了できません。

次のプロセスを使用して終了したいと思います。

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スイッチを使用しましたpkillpkill

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

引用する

おすすめ記事