Tay*_*mon 16 bash signals shell-script
当我make从 shell运行命令(在一个大项目上)时,我可以输入 Ctrl-Z 来停止进程并返回到 shell。随后,我可以运行fg以继续该过程。
我正在尝试编写一个 shell 脚本来自动执行此操作(具体来说,每隔几秒钟检查一次我的 CPU 温度,并在温度过高时停止该过程,因为我的计算机容易过热)。我的第一次尝试是这样工作的(简化):
make &
subpid="$!"
sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"
sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"
wait "$subpid"
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有用。向进程发送 SIGSTOP 并没有暂停它(正如它继续向终端发送输出所证明的那样)。我make &在命令行运行,发送 SIGSTOP,并使用ps;检查进程状态;它被列为已停止(并在我发送 SIGCONT 时再次启动),但它仍在喷出输出并提高我的核心温度!用 Ctrl-Z 停止它从来没有出现过这个问题,但我不知道如何在脚本中做到这一点。
是什么让 Ctrl-Z 与 不同kill -STOP,我如何在 shell 脚本中获得前者的行为?
小智 5
如果指定负 PID 值 - 会话领导者的 PGID,则可以向进程组中的所有进程发送信号。
kill -STOP -"$subpid"
Run Code Online (Sandbox Code Playgroud)
注意:要在新会话中运行程序,请使用setsid make. 但在你的情况下,我认为没有必要。但是,如果 make 递归运行,则 make 的每个实例都可以是它自己的领导者(我不确定)。
另一种选择可能是使用killall:
killall -STOP make
Run Code Online (Sandbox Code Playgroud)
Ctrl+Z 和 kill -STOP 的区别:
你不想停止这个make过程;您想要停止该make进程及其所有子进程。我敢打赌 make 正在递归运行。
您可以尝试set -m,然后使用%1代替"$subpid"。
启用set -m“作业控制”,该功能在脚本内默认处于关闭状态。我认为它应该适合您的用例,尽管人们似乎普遍认为这是一个坏主意。