Bash:当 control-c 无法终止进程时该怎么办,因为 bash 脚本包含调用另一个进程的循环:有没有更好的解决方案来打开/关闭电源按钮?

Bash:当 control-c 无法终止进程时该怎么办,因为 bash 脚本包含调用另一个进程的循环:有没有更好的解决方案来打开/关闭电源按钮?

这个问题的全名是:

Bash:当 control-c 无法终止进程时该怎么办,因为 bash 脚本包含调用另一个进程的循环:有没有更好的解决方案来打开/关闭电源按钮?

这个问题的标题很容易理解,但这里有一些更详细的信息:

我正在运行一个 bash 脚本,它调用另一个程序。(运行/执行另一个程序。)

该程序是一个数据/曲线拟合程序,不能被中断CTRL-C。但是,从阅读这个邮政,我发现我可以用CTRL-\

假设的想法...

因此,只需按下键盘上的 CTRL 键,然后按下\键,如果你昨天买了一个非常昂贵的机械键盘,但没有足够的钱再买一个你愿意“捣碎”的便宜键盘(因为你不想在闪亮的新机械键盘磨损之前用完你拥有的 10^6 个按键中的任何一个),或者没有足够的时间在家里找到你的旧键盘,因为你的房子要么极其混乱(混乱)或因为同时发生了紧急情况,例如炸锅着火了……

还请考虑一下循环正在调用该拟合程序,也许您正在拟合 1000 个数据文件,按下该\键 1000 次可能会花费很长时间。

超空间思考...

或者甚至;如果你在 Bash 脚本中犯了一个错误并且它实际上正在执行一个无限循环怎么办?

在这种情况下,你能做什么来阻止父脚本运行?你可以拔掉电脑电源,按住电源按钮 10 秒钟关闭它,或者把它扔进油锅里让它停止工作,但这些解决方案似乎不明智,因为可能会发生数据丢失。

理论上,可以运行系统监视器并退出 bash 进程,但如果有许多同名的进程,这可能很难找到……此外,您可能有一台单核计算机,或者一台有 N 个核的多核计算机,运行着 N 个进程,这些进程都试图使用 100% 的 CPU。或者可能只有 1 个进程使用了​​超过 4 GB 的 RAM,因此您的计算机速度非常慢……至少现在运行系统监视器的速度太慢了。在此之后的下一个最佳选择是按 CTRL-ALT-F1 并尝试以 root 身份登录,然后使用以下命令找到有问题的 bash 父级ps -A……kill PID但同样,如果您的计算机负载过重,不断向交换区写入数据,这可能需要花费您几分钟的时间。

SIG TERM exec cpu_broken.sh;重新召集;清除屏幕;清除思维过程;继续……

有没有更好的解决办法?

答案1

因此,基本上,您运行一个脚本,使所有内容都无法访问,并且您想要快速简便的解决方案来停止它。电源循环的替代方法是按住SYSRQ键(在许多情况下,它与键相同PRTSC),然后逐个按下REISUB基本上,这是一种终止所有正在运行的进程并重新启动系统的安全方法。

另一种方法是sudo nano /proc/sysrq-trigger,在文件中写入 b 并保存。系统将立即重启

更多信息: https://en.wikipedia.org/wiki/Magic_SysRq_key

答案2

您需要终止整个进程组。进程组 ID (PGID) 是启动该组的进程的 PID。要终止进程组,您需要找到启动该进程组的进程的 PID,即启动该进程组的脚本或命令。语法为:

kill -- -PGID

例如:

kill -- -1234

这里的1234是PGID(进程组ID)。

这将向进程组中的所有进程发送 SIGTERM。要发送其他信号(例如 SIGKILL (9)),请执行以下操作:

kill -9 -1234

如何查找 PGID:

你可以做:

ps -eo 'pid,ppid,pgid,cmd'

这将显示 PID、PPID(父进程 ID)、PGID 和进程名称。

现在您可以使用grep或任何其他合适的方法来找到 PGID,然后通过上面提到的方法将其杀死。

我之所以要使用命令来显示 PPID,是因为您也可以尝试通过以下方式根据 PPID 匹配来终止该进程pkill

pkill -P PPID

例如:

pkill -P 6789

使用此方法,您需要找到所有父进程(和子进程),然后终止它们,因此,在我看来,如果您想终止所有进程,终止整个进程树是更好的方法。

答案3

通常,您可以使用tophtop类似命令来查找进程并终止它(或者,如果您知道进程的名称或 PID,您可以使用killallpkill)。例如,使用,我可以选择从终端运行的脚本,然后按+top将其终止:kEnter

在此处输入图片描述

如果这不起作用,k+ 9+Enter应该使用 SIGKILL 信号。 SIGKILL 要求立即终止进程,而不是像 SIGTERM 那样等待进程完成清理资源等。Ctrl+C进程只发送 SIGINT 来中断进程,就像 SIGTERM 那样。

使用 htop 中的树视图(按t)还意味着您可以确定脚本的父进程,并终止这些进程以确保它不会继续循环。

也可以看看:

相关内容