在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
)