2013-05-07 9 views
2

Я только что написал сценарий оболочки для управления запуском и остановкой модуля. Все кажется нормальным, пока не нахожу, что команда остановки приводит к чему-то неожиданному.linux shell kill signal SIGKILL && KILL

Я использую команду kill -s SIGKILL -- -gpid, чтобы убить группу процессов. Я использую /bin/sh запустить команду, как этот

/bin/sh -c "kill -s SIGKILL -- -gpid" 

который ответил ошибку

 
/bin/sh: line 0: kill: SIGKILL: invalid signal specification 

Тогда я заменил /bin/sh с /bin/bash, поэтому команда

/bin/bash -c "kill -s SIGKILL -- -gpid" 

, который не ответил ничего ошибка. поэтому я завершаю объяснение, что разница между bash и sh вызывает результат. Однако, когда я ls/bin/sh, я обнаружил, что /bin/sh является символической ссылкой на /bin/bash, поэтому команда должна быть одинаковой.

Я нашел синтаксис команды kill -s SIGKILL не в синтаксисе, рекомендованном, kill -s KILL.

поэтому я заменил SIGKILL с УБИЙСТВО, команда

/bin/sh -c "kill -s KILL -- -gpid" 

который ответил ничего ошибку. как описано выше, любой может объяснить это дело.

+0

Какое качество вы пользуетесь? На моем Ubuntu 12.04 '/ bin/sh' фактически указывает на'/bin/dash'.Может ли быть так, что в вашем тоже «тире», и вы читаете «bash»? – Shahbaz

+5

Когда 'bash' вызывается как' sh' (например, через symlink, как в вашем случае), он использует режим совместимости sh, где большинство современных функций отключены. Я бы поспорил, что 'sh' вызывает внешний двоичный файл для' kill', и он не распознает 'SIGKILL', но вызов' bash' использует свой встроенный, и это встроенное. – Kevin

+0

@ Kevin, делает bash так, проверяя его 'argv [0]'? – Shahbaz

ответ

3

Когда bash вызывается как sh (например, через символическую ссылку, как в вашем случае), в нем используется режим совместимости sh, где большинство современных функций отключены. Я бы сказал, что sh вызывает внешний двоичный код для kill, и он не распознает SIGKILL, но вызов bash использует встроенный, и это встроенное приложение делает.

+0

Звучит великолепно. Есть ли способ проверить разницу между внешним убийством и встроенным kill или каким-то образом отслеживать ход выполнения указанной мной команды. –

+0

Я считаю, что это не работает, как описано выше, поскольку вы можете отключить встроенный kill с помощью команды enable -n kill и затем выполнить «kill -s SIGKILL pid», который также работает. Поэтому, наверное, должно быть что-то, о чем здесь не упоминалось. –

2

Единственный действительно переносимый способ, чтобы написать эту команду

kill -9 -$gpid 

None из способов определить сигнал имени, а не номер сигнала работу на Unixes что замерзало свои утилиты оболочки в середине 90-х годов, в основном это все, кроме Linux и BSD с открытым исходным кодом. Однако SIGKILL надежно сигнализирует номер 9 и всегда был таким (начиная с V7, если не раньше).

Специальный аргумент -- не является переносным и в этом случае не является необходимым.

Если вы хотите быть немного более вежливым об этом (представляемого SIGTERM вместо), затем используйте

kill -15 -$gpid 

Опять же, это число является надежным весь путь обратно в V7.

1

Все дело в bash compatibility. Быстрое исправление для использования /bin/bash, потому что sh не может распознать SIGINT или другие функции.

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