And*_*rew 21 shell process kill ps shell-script
我经常使用bash
shell 脚本为许多不同的文件运行简单的命令。例如,假设我有以下bash
shell 脚本,称为script.sh
,它foo
在三个文本文件"a.txt"
、"b.txt"
、上运行程序/命令"c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Run Code Online (Sandbox Code Playgroud)
此外,假设这foo $strname".txt"
很慢,因此脚本的执行将需要很长时间(例如,数小时或数天)。因此,我想使用,nohup
以便即使终端关闭或断开连接也能继续执行。我还希望脚本立即转到后台,因此我将使用&
运算符。因此,我将使用以下命令来调用script.sh
:
nohup bash script.sh &
Run Code Online (Sandbox Code Playgroud)
这适用于在后台运行脚本并且没有挂断,但现在假设我想出于某种原因在某个时候终止执行。我怎样才能做到这一点?
我遇到的问题是,通过查看top
,我只能看到foo
对应于"a.txt"
. 我可以终止那个foo
调用,但是foo
相应的 to"b.txt"
被调用,然后我也必须终止那个调用,依此类推。对于for
循环中指定的数十或数百个文本文件,每foo
一个都一个一个地终止变得很痛苦!因此,我需要以某种方式终止 shell 脚本本身,而不是从 shell 脚本发出的特定调用。
当我输入命令时
ps -u myusername
Run Code Online (Sandbox Code Playgroud)
myusername
我的用户名在哪里,我得到了我正在运行的进程列表。但是我看到两个不同的进程 ID 称为bash
. 我怎么知道这些进程中的哪一个(如果有)对应于我的原始调用nohup bash script.sh &
?
JRF*_*son 16
你有几个选择。由于您的进程在后台运行,您可以使用jobs
它来查找它:
nohup bash script.sh &
...
jobs
[1]+ Running nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &
Run Code Online (Sandbox Code Playgroud)
您还可以使用pkill
在进程表中搜索命令行匹配;即:
pkill -f script.sh
Run Code Online (Sandbox Code Playgroud)
j88*_*376 12
默认情况下,ps
不会显示调用程序的参数。选项-f
和-l
两者都将显示完整呼叫。
ps -fu username
Run Code Online (Sandbox Code Playgroud)
将导致输出如下:
username 23464 66.7 0.0 11400 628 pts/5 R 15:28 1:40 bash script.sh
Run Code Online (Sandbox Code Playgroud)