バックティックyesプロセスをどのように終了できますか?

バックティックyesプロセスをどのように終了できますか?

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

$ `
bquote> yes
bquote> `

それからyesバックグラウンドで走り始めたと思いました。Ctrl+CまたはCtrl+も\プロセスを終了できません。端末を閉じましたが、プロセスが続いているようです。私が言うことができるのは、ファンがまだ機能していることを確認できることです。

次のコマンドを実行しましたが、そのいずれも機能しませんでした。

  • pkill yes
  • pkill yes\ \<defunct\>(completionを使用したときに発生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

答え1

この回答stackoverflowに関するBill Karwinの記事は、あなたが探しているものです。

プロセスを終了しましたが、親プロセスが「収穫」というアクションを実行するまで(基本的にプロセスが終了ステータスを読み取ることができるようにwait(3)を呼び出す)、死んだプロセスはプロセステーブルから消えません。まだリサイクルされていない死んだプロセスを「ゾンビプロセス」と呼びます。

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

この例外を除いて、親プロセスは zsh です。 kill -9zshプロセスと死んだプロセスはyes消えます。

htopプロセスの所有権階層をよりよく理解するには、ビューを使用します(フラット/階層遷移ビューを使用t)。

答え2

それ以降killall -9 yes、またはそれ以降もプロセスは終了しますkillall yes。状態のプロセスがyes命令名の後に表示される場合、これはプロセスではなくゾンビプロセスです。psZ<defunct>ゾンビは死んだもはやそれらを殺すことはできません。

ここで何が起こるのかは、yesプロセスが終了したことです。これ以上入力は生成されません。しかし、コマンド置換を実行するシェルプロセスは、大量のデータを読み取ってメモリへの割り当てに非常に忙しい(そして大量のデータを非常に効率的に処理できない可能性があります)。

(Linux構文)を実行してps -C yes l親プロセスを確認しますyes。あなたが殺すべき人はまさにこの人です。これを調べるもう1つの方法は、この出力がtopCPU時間の98.9%を占めていることです。

関連情報