web-dev-qa-db-ja.com

バックティックされたyesプロセスを強制終了するにはどうすればよいですか?

zshを実行しているターミナルで遊んでいました。次のように入力しました。

$ `
bquote> yes
bquote> `

そして、yesがバックグラウンドで実行され始めたと思います。どちらでもない CtrlC また Ctrl\ プロセスを殺すために働いた。ターミナルを閉じましたが、処理は続行されているようです。私が言えるのは、ファンがまだ機能していることを確認できるということだけです。

次のコマンドを実行しましたが、どちらも機能しません。

  • pkill yes
  • pkill yes\ \<defunct\>(使用時に表示される Tab 完了)
  • killall -9 yes
  • pkill zsh
  • killall -9 zsh

別のコンピューターにコピーされている大きなファイルがあり、そのプロセスを再開したくないため、コンピューターを再起動できません。

これが私のtop出力です。

top - 16:06:16 up  7:41,  3 users,  load average: 1,49, 1,33, 1,02
Tasks: 305 total,   3 running, 301 sleeping,   0 stopped,   1 zombie
%Cpu(s): 53,8 us,  2,5 sy,  0,0 ni, 43,5 id,  0,0 wa,  0,0 hi,  0,2 si,  0,0 st
KiB Mem:   6009896 total,  5897432 used,   112464 free,    17152 buffers
KiB Swap:  7811068 total,      280 used,  7810788 free.  2225944 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
24814 john      20   0 2367448 2,219g   3896 R  98,9 38,7  12:29.00 zsh         
 2134 john      20   0 1576256 117104  69868 S   2,7  1,9   2:44.03 compiz      
 1163 root      20   0  311032  66020  25016 S   2,3  1,1   9:28.03 Xorg        
25428 john      20   0   30220   3800   3008 S   2,0  0,1   0:08.48 htop        
  408 root     -51   0       0      0      0 S   1,3  0,0   4:25.59 irq/32-iwl+ 
25359 john      20   0  581928  31888  25080 S   1,3  0,5   0:00.92 gnome-term+ 
 2051 john      20   0  653056  32296  23640 S   1,0  0,5   0:05.72 unity-pane+ 
25479 john      20   0   29276   3164   2544 R   0,7  0,1   0:00.04 top         
  819 message+  20   0   40748   4044   2372 S   0,3  0,1   0:04.27 dbus-daemon 
 1995 john      20   0  363388  10984   5828 S   0,3  0,2   0:20.36 ibus-daemon 
 2049 john      20   0   39252   3544   3016 S   0,3  0,1   0:00.27 dbus-daemon 
 2103 john      20   0  205408   6516   5936 S   0,3  0,1   0:05.65 ibus-engin+ 
 2157 john      20   0  551436  10652   8376 S   0,3  0,2   0:01.35 indicator-+ 
24009 nobody    20   0  275852  14904  12260 S   0,3  0,2   0:23.73 smbd        
24536 root      20   0       0      0      0 S   0,3  0,0   0:00.33 kworker/u8+ 
    1 root      20   0   33888   4452   2720 S   0,0  0,1   0:01.67 init        
    2 root      20   0       0      0      0 S   0,0  0,0   0:00.00 kthreadd    

これが私のps aux | grep yes出力:

$ ps aux | grep yes
john     25004  0.1  0.0      0     0 ?        Z    15:53   0:01 [yes] <defunct>
john     25603  0.0  0.0  15976  2220 pts/25   S+   16:13   0:00 grep --color=auto yes
4
Exeleration-G

この回答 ビルカーウィンによるstackoverflowは、まさにあなたが探しているものです:

プロセスを強制終了しましたが、デッドプロセスは、その親プロセスが「リーピング」と呼ばれるタスクを実行するまで(基本的に、そのプロセスが終了ステータスを読み取るためにwait(3)を呼び出すまで)プロセステーブルから消えません。刈り取られていないデッドプロセスは「ゾンビプロセス」と呼ばれます。

31756に表示される親プロセスIDはプロセスID1であり、これは常にinitに属します。そのプロセスは定期的にゾンビプロセスを取得する必要がありますが、それができない場合は、再起動するまでプロセステーブルにゾンビが残ります。

この場合を除いて、親プロセスはzshです。 kill -9zshプロセスと廃止されたyesはなくなります。

htopをチェックして、プロセスの所有権階層をよりよく把握します(フラット/階層ビューを t)。

5
tarleb

killall -9 yesの後、およびkillall yesの後でも、yesプロセスは停止しています。 psが状態Zのプロセスを示し、<defunct>がコマンド名の後にある場合、それはプロセスではなく、ゾンビです。 ゾンビは死んでいます そしてあなたはそれらをこれ以上殺すことはできません。

ここで起こっていることは、yesプロセスが停止しているということです。これ以上の入力は生成されません。ただし、コマンド置換を実行しているシェルプロセスは、大量のデータを読み取り、メモリの割り当てに非常に忙しい(そして、おそらく大量のデータにあまり効率的に対処していない)。

ps -C yes l(Linux構文)を実行して、yesの親プロセスを確認します。それはあなたが殺す必要があるものです。それを見つける別の方法は、それがそのtop出力で98.9%のCPU時間を費やしていることです。