【问题标题】:How to stop all processing running in background without killing in this context?如何停止在后台运行的所有处理而不在这种情况下杀死?
【发布时间】:2022-01-22 01:26:07
【问题描述】:

我的名为 n_commands.sh 的 bash 脚本的格式为

command1 &
command2 &
..........
commandn &

当我在终端上运行bash n_commands.sh 时,所有命令都在后台运行。

当我尝试停止所有正在使用资源的 n 个进程时,我需要分别杀死每个进程。有什么方法可以立即停止由于命令bash n_commands.sh 而运行的所有后台进程而无需手动杀死它们?

【问题讨论】:

标签: bash background-process shortcut kill-process


【解决方案1】:

启动所有后台进程后,让主脚本等待它们完成。然后你可以杀死主脚本的整个进程组,所有的子进程也会被杀死。

command1 &
command2 &
..........
commandn &
wait

在你开始这个之后,如果你输入 Control-c 它将杀死所有的命令。

【讨论】:

  • 没有发生。进程仍在运行。
  • 我也无法让它工作。尝试一些sleep 30 & 然后wait。我可以在终端中运行脚本,然后使用ps 查看 Ctrl-C 后仍在运行的睡眠命令
  • 对不起,我以为我测试过了,但我一定是等了太久,睡眠结束了。
  • ^C 杀死等待的进程,而不是它等待的进程。
  • @YuriGinsburg 我认为它已发送到前台进程组。由于非交互式 shell 没有作业控制,因此后台进程将位于同一进程组中。
【解决方案2】:

您可以使用pkill 杀死当前进程的所有子进程。

trap "pkill -P $$" SIGINT  #intercept ^C

#if foreground ends before background jobs, the output below is 
#an argument for a pkill  -P arg comand.
echo $$    

command1 &
command2 &
..........
commandn &

...

pkill -P $p   #if you need to end bg jobs on exit.

【讨论】:

  • 您是否会将pkill 命令放在脚本进程收到信号时运行的trap 语句中?
猜你喜欢
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
相关资源
最近更新 更多