假设我在shell中输入以下内容
(while true; do echo hahaha; sleep 1; done)&
然后我知道我可以通过
杀死它fg; CTRL-C
但是,如果上面的命令在脚本中,例如tmp.sh和我正在运行该脚本,如何杀死它?
答案 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秒向标准输出 hahaha 。您无法使用 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)