如何以无限循环停止子shell中的后台作业?

如何以无限循环停止子shell中的后台作业?

tmux通过 SSH 的会话中,我运行了:

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

如何在不重新启动的情况下停止这两个后台作业?我已经运行了上面的命令,使用了ctrl + c,并关闭了tmux窗格。关于如何修改该命令的建议,以便我下次再次运行该命令时可以更轻松地关闭它,对此表示赞赏。

  • pkill sleep刚刚开始循环的下一次迭代。
  • fg说没有工作
  • ctrl + c似乎只停止子 shell,但不停止子子 shell 和后台命令。

答案1

循环的进程将被调用bash, sleep 将只是它们的子进程。您可以使用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
)

相关内容