Ctrl-Z和kill -STOP有什么区别?


14

make从外壳程序运行命令(在大型项目上)时,可以键入Ctrl-Z来停止该过程并返回到外壳程序。随后,我可以运行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"

不幸的是,这没有用。向该进程发送SIGSTOP不会暂停它(通过继续将输出发送到终端可以明显看出这一点)。我make &在命令行中运行,发送了SIGSTOP,并使用ps;检查了进程状态。它被列为已停止(并在我发送SIGCONT时再次启动),但它仍在喷射输出并提高核心温度!使用Ctrl-Z停止它从来没有这个问题,但是我不知道如何在脚本中做到这一点。

是什么使Ctrl-Z与有所不同kill -STOP,以及如何在Shell脚本中获得前者的行为?


是的,make正在递归运行。实际上,我认为它有多个层次。
2013年

Answers:


12

是什么使Ctrl-Z与有所不同kill -STOP,以及如何在Shell脚本中获得前者的行为?

CTRL-Z通常会发送SIGTSTP(可以阻止),并且-除了其他原因-shell经常在这些情况下将tty重置为以前保存的状态。但是,更重要的是,控制终端进程组设置为Shell的PID(然后再次设置为以继续的作业的PID fg)。

回到您的原始问题:使用像Cpufreqd这样与温度相关的频率缩放实际上可能是您的指甲更好的锤子。


4

您不想停止该make过程;您想要停止该make进程及其所有子进程。我敢打赌,make正在递归运行。

您可以尝试set -m,然后使用%1代替"$subpid"

set -m启用“作业控制”,这是默认关闭的内部脚本。我认为它应该适合您的用例,尽管人们似乎通常认为这是一个坏主意


4

如果您指定负PID值-会话负责人的PGID,则可以向进程组中的所有进程发送信号。

kill -STOP -"$subpid"

注意:要在新会话中运行程序,请使用setsid make。但就您而言,我认为这是没有必要的。但是,如果make是以递归方式运行的,则make的每个实例都可以充当其自己的领导者(我不确定)。

另一种选择是使用killall

killall -STOP make

Ctrl + Z和kill -STOP之间的区别:

  • Ctrl-Z实际上发送TSTP,可以将其阻止。
  • STOP不能被阻止。

PGID方法无效,产生了以下输出行:/usr/local/bin/myscript: line 38: kill: (-10202) - No such process。后台进程继续运行。我认为这种killall方法行不通,因为某些子流程似乎sh不是make
Taymon

您向其发送信号的过程似乎已经完成。make会产生名为sh的子流程。对于您的make和许多子过程,最好的方法可能是获取所有子代的PID并将其全部停止。
2013年

当我从外壳程序手动完成操作时,它就可以工作了,但是在外壳程序脚本中却没有。我在想这是因为当我手动执行时,根PID(其他人从中继承了他们的PGID)是第一个make命令的根PID,但是当我从脚本中执行时,根PID是来自Shell脚本本身。
2013年

1

Ctrl+ C用于杀死带有信号的进程,SIGINT换句话说,这是礼貌的杀死

Ctrl+ Z 用于通过向其发送信号SIGSTP来暂停进程,该信号类似于睡眠信号,可以撤消该信号,然后可以重新开始该过程。

但是,当某个进程被挂起时,我们可以通过fg (在前台恢复)bg (在后台恢复,但是我无法恢复进程,这是使用Ctrl+ CCtrl+ 的区别Z

如何查看暂停的进程?

当您有多个暂停的命令时,要列出它们,请使用 jobs命令,输出将是:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

如何在后台杀死暂停的进程?

通过使用 kill命令:

kill %n其中ñ是作业号码(一个在方括号从作业输出),所以我要杀死猫:kill %1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.