無限ループのサブシェルでバックグラウンドタスクを停止する方法は?

無限ループのサブシェルでバックグラウンドタスクを停止する方法は?

tmuxSSHを介したセッションで以下を実行しました。

( \
  ( while true; do echo subsubshell1 && sleep 5; done ) & \
  ( while true; do echo subsubshell2 && sleep 10; done ) & \
  wait; \
)

再起動せずにこの2つのバックグラウンドタスクをどのように停止できますか?上記のコマンドを実行して使用し、ウィンドウをctrl + c閉じtmuxました。次回の再実行時に、より簡単に閉じるようにコマンドを変更する方法について提案をいただきありがとうございます。

  • pkill sleepループの次の繰り返しを開始しました。
  • fg仕事がないと言いました。
  • ctrl + cサブシェルだけを停止し、サブサブシェルとバックグラウンドコマンドは停止しないようです。

答え1

ループプロセスが呼び出され、bashスリープはその子プロセスになります。ps以下を使用して、睡眠プロセスの親プロセスであるbashプロセスを確認できます。

$ ps -auf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
jesse_b    255  0.0  0.0  10172  3248 pts/0    S    20:11   0:00 -bash
jesse_b    259  0.0  0.0   7232   580 pts/0    S    20:11   0:00  \_ sleep 10
jesse_b    254  0.0  0.0  10172  3248 pts/0    S    20:11   0:00 -bash
jesse_b    258  0.0  0.0   7232   520 pts/0    S    20:11   0:00  \_ sleep 5
jesse_b     13  0.0  0.0  10172  5252 pts/0    Ss   20:05   0:00 -bash
jesse_b    265  0.0  0.0  10856  3392 pts/0    R+   20:11   0:00  \_ ps -auf

この場合、PID 254と255は終了する必要があるbashプロセスです。

または、次のようにしてPIDをエコーすることもできます。

( 
  ( while true; do echo subsubshell1 && sleep 5; done ) & 
  pids+=($!)
  ( while true; do echo subsubshell2 && sleep 10; done ) &
  pids+=($!)
  echo "${pids[@]}"
  wait
)

関連情報