终止后台运行的 bash shell 脚本

终止后台运行的 bash shell 脚本

我经常使用bashshell 脚本为许多不同的文件运行简单的命令。例如,假设我有以下bash名为 的 shell 脚本,它在三个文本文件、、上script.sh运行程序/命令:foo"a.txt""b.txt""c.txt"

#!/bin/bash

for strname in "a" "b" "c"
do
foo $strname".txt"
done

另外,假设速度foo $strname".txt"很慢,因此脚本的执行将花费很长时间(例如几小时或几天)。因此,我想使用这样的nohup方式,即使终端关闭或断开连接,执行也会继续。我还希望脚本立即转到后台,所以我将使用运算&符。因此我将使用以下命令来调用script.sh

nohup bash script.sh &

这对于在后台运行脚本并且不会挂起来说效果很好,但现在假设我想出于某种原因在某个时刻终止执行。我怎样才能做到这一点?

我遇到的问题是,通过查看top,我只看到foo与 相对应的"a.txt"。我可以终止该foo调用,但随后foo相应的"b.txt"被调用,然后我也必须终止该调用,依此类推。对于循环中指定的数十或数百个文本文件,逐个for终止每个文件变得很痛苦!foo所以我需要以某种方式终止 shell 脚本本身,不是特别的从 shell 脚本发出的调用。

当我输入命令时

ps -u myusername

我的用户名在哪里myusername,我得到了我正在运行的进程的列表。但我看到两个不同的进程 ID,称为bash.我如何知道这些进程中的哪一个(如果有)对应于我的原始调用nohup bash script.sh &

答案1

你有几个选择。由于您的进程在后台运行,因此您可以使用以下命令jobs来查找它:

nohup bash script.sh &
...
jobs
[1]+ Running    nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &

您还可以使用pkill在进程表中搜索命令行匹配;即:

pkill -f script.sh

答案2

默认情况下,ps不会显示调用程序时使用的参数。选项-f-l两者都将显示完整的调用。

ps -fu username

将产生如下所示的输出:

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh

答案3

输出ps(例如ps aux)包括父进程的进程 ID。杀死父进程bash,它的子进程也将被终止。

对于进程树的 ASCII 可视化,请尝试pstree -p运行一些后台进程。

相关内容