终止后台运行的bash shell脚本


16

我经常使用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 &


@Andrew,两个过程都显示命令中提到的nohup吗?....或者,您可以尝试ps -aWu Andrew,并检查是否找到了一个带有nohup的长条目..这有帮助吗?
尼汀

2
顺便说一句,您的报价古怪。for s in a b c; do foo "$s".txt; done
2014年

1
@NSD:不,在nohup您提出一个流程清单来查看您开始的工作时,这已经很久了。您可以查看输出中的“ niceness”列,ps但此处的答案更有用。
Tripleee 2013年

Answers:


9

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

ps -fu username

将导致输出如下所示:

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

2
这是适度有用的,但不会消除具有相同参数的多个进程的歧义。
Tripleee 2013年

11

您有两种选择。由于您的进程在后台运行,因此可以使用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

1

ps输出(用例如ps aux)包括父进程ID。杀死父母bash,其子女也将被处决。

为了使ASCII码树可视化,请尝试pstree -p运行一些后台进程。

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.