如何正确地终止一个不断调用其他程序的后台 .sh 脚本而不会“自杀”/终止我的所有进程?

如何正确地终止一个不断调用其他程序的后台 .sh 脚本而不会“自杀”/终止我的所有进程?

我登录到远程服务器(服务器是 CentOS,我在 Ubuntu 上)。我执行了以下命令:

nohup bash script.sh > log.txt &

script.sh 包含以下内容(简化):

for q (some condition that will trigger about 60 times)
do
sed (change config file for some other program depending on q)
execute some other program (each call of this other program takes about 25 minutes)
done

不幸的是,我发现另一个程序中有一个小错误。我毫不费力地修复了它,但实际上我无法终止这个脚本,因此我可以使用修复后的其他程序重新启动它。当我在开始时执行 nohup bash script.sh 时,它弹出一个数字 1946,我假设这是 script.sh 的 pid。我这样做了:

pkill 1946

这停止了​​ script.sh 调用的其他程序(我可以从它创建的日志文件中看出)。但是,script.sh 随后调用了另一个程序的下一个迭代。我之所以能看出这一点,是因为 script.sh 生成的日志文件告诉我了这一点,而且,另一个程序使用了我的 GPU,我可以使用 nvidia-smi 对其进行监控。我在“top”中看不到 script.sh,但我看到了它不断调用的程序。我可以通过以下方法解决这个问题:

while true
do
sleep 1
pkill (the other program)

大约一分钟后,它会终止 script.sh 执行的所有迭代。但这不是一种优雅的方法。

如果我亲自到达服务器所在地(有时我会去),我会在相同情况下执行以下操作:

pkill -u (me)

这会毁掉我正在做的所有事情。我只需重新登录并重新开始,没什么大不了的。在我调试其他程序时,这种情况经常发生。但现在我通过在服务器上执行以下命令登录:

ssh -r (server) (my home)

如果我这样做,它就会断开我与服务器的连接。显然我不想这样做。

通常情况下,我会更大胆一些,在跑到这里询问之前先尝试一下,但我现在很谨慎。我不想终止我的 ssh 连接。我怎样才能优雅地终止 script.sh?(是的,我确实尝试过简单地执行“pkill script.sh”或“kill script.sh”,但它什么也没做)。

答案1

ps -edf | grep 脚本.sh

终止进程。首先关注生成其余进程的主进程。然后再逐步处理所有子进程。

然后使用 -9 终止进程

或者

killall脚本

相关内容