Откройте, а затем убейте дочерний процесс из Bash - PullRequest
3 голосов
/ 16 сентября 2011

Какой лучший способ выполнить команду и затем убить ее через некоторое время? Вот что у меня есть; он выполняет свою работу, но я получаю amp: command not found и хотя я не уверен, зачем вообще нужен усилитель, я знаю, что убийство не работает без него.

feh "$output""$ext" &
echo $!
sleep 1
kill -s 9 $!
exit 1

Дело в том, что я не знаю PID процесса, который я выполняю. Могу ли я назначить один при исполнении?

Ответы [ 3 ]

7 голосов
/ 16 сентября 2011

GNU timeout , часть последних версий coreutils, делает именно то, что вы хотите.

timeout 1 feh "$output""$ext"

запускает feh в течение одной секунды, а затем убивает его, если он не 't уже закончился.

Остальная часть этого комментария касается вашего текущего рецепта:

Рецепт, который вы используете в настоящее время, помещает feh в фон, используя &.amp; после ошибки, вероятно, из-за чрезмерного усердия в кодировщике HTML (& - это то, как вы пишете & в HTML).

При запуске ядру каждому процессу назначается PID.$! - это переменная оболочки для pid самого последнего фонового процесса.

4 голосов
/ 16 сентября 2011
feh "$output""$ext" &
FEHPID=$!
sleep 1
kill -s 9 $FEHPID
exit 1
4 голосов
/ 16 сентября 2011

Вы не хотите "&", вы просто хотите "&".Амперсанд сообщает bash запустить процесс в фоновом режиме.

The $!установлен на pid фонового процесса, так что в противном случае ваш образец должен делать то, что вы хотите.

...