2010-12-01 3 views
3

У меня возникло странное поведение для определенного приложения, которое я использую. Если я начинаю команду в фоновом режиме в Баш, я могу убить его с помощьюУбивание процесса в скрипте

$ command & 
$ kill -n 2 [PID of command] 
    killing command gracefully 

Однако, когда я бросаю это в сценарий:

command & 
ID=$! 
kill -n 2 $ID 

это ничего не делать вообще. Есть ли какие-то тонкие недостатки?

Edit: Еще один ключ в том, что после того, как скрипт перестает работать, я не могу убить команду, используя убить -n 2.

+0

`ID = command &` не делает то, что вы думаете. – nmichaels 2010-12-01 22:20:05

+0

Простите, ленился с сокращением моего кода. Ред. – victor 2010-12-01 22:21:13

+0

Почему бы не использовать kill -9 $ PID – chemila 2011-11-10 02:28:59

ответ

0

Если команда выводит на терминал, Баш остановит его с SIGSTOP, который будет заставьте его игнорировать SIGINT, который вы отправляете.

0

Ваш ID $ соответствует командной строке, а то, что вам нужно, - это PID. Может быть, попробовать это:

ID=`pidof -s command` 
kill -9 $ID 
0

Это, вероятно, не ваша проблема, но -n вариант для встроенной команды глушения в Bash. Я бы предложил использовать -NAME вместо этого, чтобы он работал и для фактической команды.

0

Некоторые оболочки, поддерживающие управление заданиями в интерактивном режиме, не позволяют включить управление заданиями по сценариям по умолчанию. set -m включит управление заданиями.

0

Добавить команду wait сразу после вашего kill.

0

Похоже, что если команда запущена из сценария, она будет обрабатывать/игнорировать некоторые сигналы. Тем не менее, вы все еще можете убить процесс с SIGKILL (1), как это:

kill -n 1 $ID 
1

человек 7 Сигнал Вы отправляете сигнал 2, INT, к процессу, то есть прерывание от клавиатуры, то почему? Люди говорят, чтобы послать сигнал 1, почему?

Стандартный изящный способ убить процесс - это сигнал 15, Сигнализация завершения, которая используется по умолчанию для kill.

Так просто использовать убить «$ PID»

Затем, в случае, если ваш процесс запуска подпроцесса, вы не просто хотите, чтобы убить отца, но вы хотите, чтобы убить их всех, так что используйте «- $ PID «вместо« $ PID », чтобы убить всю группу процессов, но, как убивает, подумает, что это« $ PID »- это номер сигнала, он будет жаловаться, поэтому вам нужно быть более точным, так как:

kill -15 -"$PID" 

Если программа не хочет умирать, используйте убить -9 - "$ PID"

man 7 signal 
man kill 
Смежные вопросы