我有一些bash脚本,我在后台放了一个命令块然后想要杀死它们
#!/bin/bash
{ sleep 117s; echo "test"; } &
ppid=$!
# do something important
<kill the subprocess somehow>
我需要找到一种方法来杀死子进程,所以如果它仍然处于休眠状态,那么它就会停止睡眠并且&#34;测试&#34;不会被打印出来。我需要在脚本中自动完成,所以我不能使用另一个shell。
到目前为止我已尝试过:
kill $ppid
- 根本没有杀死睡眠(也有-9标志),睡眠ppid变为1但测试不会被打印kill %1
- 与上面的结果相同kill -- -$ppid
- 它抱怨kill: (-30847) - No such process
(并且子流程仍在此处)pkill -P $ppid
- 测试已打印我该怎么做?
答案 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