2015-02-03 2 views
4

У меня есть Баш скрипт, где я ставлю блок команд в фоновом режиме, а затем хотят убить ихBash убить фон команду блокировать

#!/bin/bash 
{ sleep 117s; echo "test"; } & 
ppid=$! 
# do something important 
<kill the subprocess somehow> 

мне нужно найти способ, чтобы убить подпроцесс, так что если он еще спит затем он перестает спать, и «тест» не будет напечатан. Мне нужно сделать это автоматически в скрипте, поэтому я не могу использовать другую оболочку.

То, что я уже пытался до сих пор:

  1. kill $ppid - не убивает сон вообще (с -9 флагом тоже), PPID сон становится 1, но тест не будет печататься
  2. kill %1 - такой же результат, как и выше
  3. kill -- -$ppid - жалуется kill: (-30847) - No such process (и подпроцесс еще здесь)
  4. pkill -P $ppid - тест был напечатан

Как это сделать?

ответ

1

Запуск группы команд в своей суб-оболочки. Используйте set -m для запуска суб-оболочки в собственной группе процессов. Убить группу процессов

#!/bin/bash 
set -m 
(sleep 117s; echo "test";) & 
ppid=$! 
# do something important 
kill -- -$ppid 
+0

Не могли бы вы объяснить разницу между '{...}' и '(...)' в случае фоновой задачи? –

+0

@GrigoryKalabin, хороший пункт. В случае фоновой задачи оба выполняются в под-оболочке – iruvar

1

Просто changue код для:

{ sleep 117s && echo "test"; } & 

От bashman:

command1 & & command2

Команда2 выполняется тогда и только тогда, когда command1 возвращает статус выхода от нуля.

Демо:

$ { 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 
+0

Это работает, но выглядит как обходной путь. Собственно, этот способ не будет работать, если мне придется обрабатывать ненулевые коды выхода. Решение 1_CR лучше, но в любом случае, спасибо! –

Смежные вопросы