周围的子炮被击毙后,wget不会停止

时间:2016-08-29 10:26:42

标签: shell signals sh wget kill

请参阅:

(wget http://stackoverflow.com/questions/ask && echo 'ok' || echo 'failed') & pid=$!
sleep 1      # this is curcial
kill $pid

如果取出第二行,脚本完成后就没有挂起的wegt。 我想要实现的是在某个时候杀死wget进程(或整个子shell)并根据wget的退出代码进行更多处理。 你能解释一下为什么上面的脚本中的wget没有被正确杀死,以及如何制作它?或者有什么方法可以实现我想要的目标吗?

2 个答案:

答案 0 :(得分:0)

请考虑以下事项:

$ foo=foo
$ export foo
$ (foo=bar; echo foo is $foo); echo foo is $foo
foo is bar
foo is foo

流程不会改变其父级环境。这也适用于shell进程和子shell。

大括号在不创建子shell的情况下改变逻辑优先级:

$ foo=foo
$ export foo
$ { foo=bar; echo foo is $foo); }; echo foo is $foo
foo is bar
foo is bar

所以我认为你想要

{ wget http://stackoverflow.com/questions/ask \
  && echo 'ok' || echo 'failed'; } & 
kill $!
  

我希望...杀死wget进程(或子shell)...并根据wget的退出代码进行更多处理。

我认为这个例子是简化的,你真正想知道的是wget是否成功完成,以及它是否被杀死。所有这些信息都将在$!中,但echo 'failed'将返回true。如果这是一个问题,请在回显消息之前捕获状态。

答案 1 :(得分:0)

而不是kill $pid,请执行以下操作:

wpid=$(ps -o pid=,ppid=,cmd= \
        | awk '$2 == '$pid' && $3 == "wget" { print $1 }')
[ -n "$wpid" ] && kill $wpid