2016-08-29 4 views
0

См:Wget не остановится после того, как окружающая подоболочка убита

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

Если вынул вторую строчку, там не будет висеть wegt после завершения сценария. То, что я хочу достичь, - это убить процесс wget (или подоболочку в целом) в какое-то время и сделать больше обработки на основе кода выхода wget. Можете ли вы объяснить мне, почему wget в вышеприведенном скрипте не убивается должным образом и как это сделать? Или я могу достичь того, чего хочу?

ответ

0

Рассмотрим следующий пример:

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

А процессы не меняет среду своего родителя. Это касается и процессов оболочки и подоболочек.

брекеты изменяют логический приоритет, не создавая подоболочку:

$ 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 процесс (или подоболочки). .. и делать больше обработки на основе кода выхода wget.

Я предполагаю, что этот пример упрощен, и то, что вы действительно хотите знать, является ли wget завершенным успешно или нет, и если оно было убито. Вся эта информация будет в $!, за исключением того, что echo 'failed' вернет true. Если это проблема, задержите статус перед повторением сообщения.

+0

спасибо, но это не работает, если вы положили спать 1, прежде чем убить $ !, Я не хочу, чтобы Wget сразу убить, но после того, как делать некоторые работы. Я думаю, что в этом случае обе скобки и скобки создают подоболочки, поскольку они все работают в фоновом режиме. – pdg

0

а не делать kill $pid, сделайте следующее:

wpid=$(ps -o pid=,ppid=,cmd= \ 
     | awk '$2 == '$pid' && $3 == "wget" { print $1 }') 
[ -n "$wpid" ] && kill $wpid 
Смежные вопросы