2016-04-02 71 views
1

假设我输入一个shell如何杀死一个脚本创建的后台进程

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

那么下面我知道我可以通过

fg; CTRL-C 

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

+0

你可以用$杀死最后产生的作业! http://stackoverflow.com/questions/1624691/linux-kill-background-task $!是开始的最后一份工作的pid。 – LinuxDisciple

回答

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

$!会拿起PID运行,所以你可以用它做你希望的过程中

+0

他要求把所有内容都放在剧本中!您应该将该pid保存在一个文件中。脚本的执行将导致在后台创建一个新的bash进程(当前bash的子进程)。因此,在后台bash进程中执行的每个变量都无法通过会话领导bash访问。 –

+0

我读过的是如何杀死在脚本中产生的后台运行的进程。根据我的回答是正确的,OP没有提到必须保留PID,以便在从不同的脚本开始进程的初始产卵之后的晚些时候运行。我编写了许多脚本,它们可以在多台机器上并行运行多个子进程,并等待它们完成。为什么要写入磁盘的所有复杂因素,然后在文件系统中混乱起来。 –

+0

如果你把所有内容放在同一个脚本中,是的,它会立即自杀。但是,这不是@南华的问题。他提出了一个在后台运行的“while true”脚本,并要求确定如何使用会话首领shell来杀死它,因为fg; Ctrl + C无法做到这一点。将pid写入文件将允许您从任何具有权限访问文件的进程访问pid。这不是一个复杂的事情,这是守护进程如何将它们的pid写入文件,以便于参考。 –

0

让我们假设你有你的bash脚本命名为tmp.sh下一个内容:

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

你执行它!当然,它会每1秒打印一次haha​​ha到stdout。您不能使用作业命令列出它。但是......这仍然是一个过程!它是当前终端森林里的一个孩子!所以:

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-现在,你可以看到的例子列出了睡眠1个命令是/bin中的孩子/ bash过程PID 。现在杀了它!

kill -9 3787 

注:不要杀具有S +状态的bash进程,是bash进程,让您的提示!从人(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)