Bash kill后台命令块

时间:2015-02-03 15:47:55

标签: bash shell kill-process

我有一些bash脚本,我在后台放了一个命令块然后想要杀死它们

#!/bin/bash
{ sleep 117s; echo "test"; } &
ppid=$!
# do something important
<kill the subprocess somehow>

我需要找到一种方法来杀死子进程,所以如果它仍然处于休眠状态,那么它就会停止睡眠并且&#34;测试&#34;不会被打印出来。我需要在脚本中自动完成,所以我不能使用另一个shell。

到目前为止我已尝试过:

  1. kill $ppid - 根本没有杀死睡眠(也有-9标志),睡眠ppid变为1但测试不会被打印
  2. kill %1 - 与上面的结果相同
  3. kill -- -$ppid - 它抱怨kill: (-30847) - No such process(并且子流程仍在此处)
  4. pkill -P $ppid - 测试已打印
  5. 我该怎么做?

2 个答案:

答案 0 :(得分:1)

只需更改代码:

{ sleep 117s && echo "test"; } &

来自bash man

  

command1&amp;&amp;命令2

     当且仅当command1返回退出状态时,才执行

command2   为零。

演示:

$ { sleep 117s; echo "test"; } &
[1] 48013
$ pkill -P $!
-bash: line 102: 48014 Terminated              sleep 117s
$ test

[1]+  Done                    { sleep 117s; echo "test"; }



$ { sleep 117s && echo "test"; } &                                                                                                      
[1] 50763
$ pkill -P $!                                                                                                      
-bash: line 106: 50764 Terminated              sleep 117s

答案 1 :(得分:1)

在自己的子shell中运行命令组。使用set -m在其自己的进程组中运行子shell。杀死进程组

#!/bin/bash
set -m
( sleep 117s; echo "test"; ) &
ppid=$!
# do something important
kill -- -$ppid