请参阅:
(wget http://stackoverflow.com/questions/ask && echo 'ok' || echo 'failed') & pid=$!
sleep 1 # this is curcial
kill $pid
如果取出第二行,脚本完成后就没有挂起的wegt。 我想要实现的是在某个时候杀死wget进程(或整个子shell)并根据wget的退出代码进行更多处理。 你能解释一下为什么上面的脚本中的wget没有被正确杀死,以及如何制作它?或者有什么方法可以实现我想要的目标吗?
答案 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