如何终止在脚本中创建的后台进程

时间:2016-04-02 04:17:22

标签: bash shell

假设我在shell中输入以下内容

(while true; do echo hahaha; sleep 1; done)&

然后我知道我可以通过

杀死它
fg; CTRL-C

但是,如果上面的命令在脚本中,例如tmp.sh和我正在运行该脚本,如何杀死它?

2 个答案:

答案 0 :(得分:3)

(while true; do echo hahaha; sleep 1; done)&
RUNNING_PID=$!
kill ${RUNNING_PID}

$!将获取正在运行的进程的PID,以便您可以根据需要使用它

答案 1 :(得分:2)

假设您的bash脚本名为 tmp.sh ,其中包含下一个内容:

#!/bin/bash
(while true; do echo hahaha; sleep 1; done)&

你执行它!当然,它会每1秒向标准输出 haha​​ha 。您无法使用 jobs 命令列出它。但是......它仍然是一个过程!它是当前航站楼森林里的孩子!所以:

1-获取连接到标准输入的终端的文件名:

$tty
/dev/pts/2

2-列出与终端关联的进程(在我们使用pts / 2的示例中),并使用S显示状态并以林格式显示f

$ps --tty pts/2 Sf
PID TTY      STAT   TIME COMMAND
3691 pts/2    Ss+    0:00 /bin/bash
3787 pts/2    S      0:00 /bin/bash
4879 pts/2    S      0:00  \_ sleep 1

3-现在,您可以看到该示例列出了 sleep 1 命令,该命令是 / bin / bash 进程的子进程,其中PID 3787 < / em>的。现在杀了它!

kill -9 3787

注意:不要杀死具有s +状态的bash进程,bash进程会提示你提示!来自 man(ps)

s    is a session leader
+    is in the foreground process group

<强>推荐

在这种情况下,您应该将 PID 保存在文件中:

#!/bin/bash
(while true; do echo hahaha; sleep 1; done)&
echo $! > /path/to/my_script.pid

然后,你可以做一些脚本来关闭它:

#!/bin/bash
kill -9 $(cat /path/to/my_script.pid)