假设我输入一个shell如何杀死一个脚本创建的后台进程
(while true; do echo hahaha; sleep 1; done)&
那么下面我知道我可以通过
fg; CTRL-C
杀死它。然而,如果上面的命令是在例如脚本中tmp.sh和我正在运行该脚本,如何杀死它?
假设我输入一个shell如何杀死一个脚本创建的后台进程
(while true; do echo hahaha; sleep 1; done)&
那么下面我知道我可以通过
fg; CTRL-C
杀死它。然而,如果上面的命令是在例如脚本中tmp.sh和我正在运行该脚本,如何杀死它?
(while true; do echo hahaha; sleep 1; done)&
RUNNING_PID=$!
kill ${RUNNING_PID}
$!会拿起PID运行,所以你可以用它做你希望的过程中
他要求把所有内容都放在剧本中!您应该将该pid保存在一个文件中。脚本的执行将导致在后台创建一个新的bash进程(当前bash的子进程)。因此,在后台bash进程中执行的每个变量都无法通过会话领导bash访问。 –
我读过的是如何杀死在脚本中产生的后台运行的进程。根据我的回答是正确的,OP没有提到必须保留PID,以便在从不同的脚本开始进程的初始产卵之后的晚些时候运行。我编写了许多脚本,它们可以在多台机器上并行运行多个子进程,并等待它们完成。为什么要写入磁盘的所有复杂因素,然后在文件系统中混乱起来。 –
如果你把所有内容放在同一个脚本中,是的,它会立即自杀。但是,这不是@南华的问题。他提出了一个在后台运行的“while true”脚本,并要求确定如何使用会话首领shell来杀死它,因为fg; Ctrl + C无法做到这一点。将pid写入文件将允许您从任何具有权限访问文件的进程访问pid。这不是一个复杂的事情,这是守护进程如何将它们的pid写入文件,以便于参考。 –
让我们假设你有你的bash脚本命名为tmp.sh下一个内容:
#!/bin/bash
(while true; do echo hahaha; sleep 1; done)&
你执行它!当然,它会每1秒打印一次hahaha到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)
你可以用$杀死最后产生的作业! http://stackoverflow.com/questions/1624691/linux-kill-background-task $!是开始的最后一份工作的pid。 – LinuxDisciple