Почему «kill -9» убивает браузер, а также сервер?

Иногда мне приходится использовать kill -9 в качестве последнего средства для уничтожения моего сервера rails. К сожалению, я должен сделать это достаточно часто, чтобы написать свою вспомогательную функцию в моем файле bash_profile.

Если я сделаю это вручную – ps aux | grep '[r]ails] ps aux | grep '[r]ails] , возьмите pid (например, 12345 ) и kill -9 12345 – он убивает сервер и оставляет его неповрежденным. Но моя функция также убивает браузер, чего я не хочу делать:

 function running { ps -p $(lsof -i :3000 -t) &> /dev/null } function k9 { if running then kill -9 $(lsof -i :3000 -t) else echo "Rails server is not running" fi } 

Я подтвердил, что lsof -i :3000 -t захватывает тот же pid, что и у ps aux , так что я делаю неправильно?

One Solution collect form web for “Почему «kill -9» убивает браузер, а также сервер?”

Проблема:

С lsof -i :3000 -t вы будете искать любые процессы, подключенные к порту 3000, который может находиться на удаленной стороне.

В тех случаях, когда вы используете свой скрипт, браузер, похоже, имеет привязку к серверу rails на порту 3000. Разница заключается в синхронизации между браузером и использованием kill .

Это означает, что браузер также указан в выводе lsof и убит.

Вам лучше убивать процессы, которые выглядят как ваш сервер rails, а не что-то, что использует порт 3000, локально или где-либо еще.

Общее решение:

pkillправильный инструмент для работы.
Для того, чтобы попробовать то, что соответствует, используйте pgrep , который соответствует тому же:

Если командная строка сервера, как показано в ps, начинается с имени команды, которая идентифицирует ваш экземпляр сервера, вы можете использовать pkill servercommand .
Если вам нужно сопоставить часть аргументов командной строки , добавьте -f , например pkill -f serverargument .

Процессы, которые были убиты pkill будут перечислены только pgrep – поэтому используйте это, чтобы попробовать, что будет убито. Добавьте параметр -a в pgrep чтобы перечислить командную строку, а не только pid.

Примеры для pgrep / pkill:

В качестве примера для использования -f : Согласно ps , эти два экземпляра xbindkeys запущены:

 $ ps aux|grep '[x]bindkeys' 26719 ? S 0:00 xbindkeys -f /tmp/xbindkeysrc-tmp 32046 ? S 0:00 xbindkeys -f /home/auser/.xbindkeysrc 

Теперь я могу найти оба экземпляра:

 $ pgrep xbindkeys 26719 32046 

Или показывая команды:

 $ pgrep -a xbindkeys 26719 xbindkeys -f /tmp/xbindkeysrc-tmp 32046 xbindkeys -f /home/auser/.xbindkeysrc 

Или сопоставить один из экземпляров с аргументами командной строки:

 $ pgrep -f '/home/auser/.xbindkeysrc' 32046 

Без -f ни один из процессов не будет согласован:

 $ pgrep '/home/auser/.xbindkeysrc' 

Наконец, отправив процессу сигнал, например, с kill :

 $ pkill -f '/home/auser/.xbindkeysrc' 

Альтернативное решение на основе оригинального подхода:

Решение с pkill является гораздо более общим, но, чтобы следовать вашему первоначальному подходу, команда lsof может быть более жесткой, чтобы соответствовать
«любой локальный сервер, прослушивающий порт»,
вместо
«любая программа, использующая локальный порт, каким-либо образом, или используя удаленный порт этого номера».

Опция -sTCP:LISTEN ограничивает список прослушиванием портов и, как только локальные порты могут быть прослушены, также только для локальных портов.

Его можно использовать как тест if следующим образом:

 if lsof -i :3000 -sTCP:LISTEN -t >/dev/null ; then echo running else echo not running fi 


Замечание по использованию SIGKILL, как в kill -9:

Сигнал KILL можно использовать с pkill точно так же, как с kill :

 $ pkill -9 -f '/home/auser/.xbindkeysrc' 

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

Взгляните, когда я не должен убивать -9 процесс? чтобы понять, почему вы не хотите использовать -9 по умолчанию.

  • Сценарий Stop bash с любым ключом
  • Как показать индикатор выполнения в то время, когда tar рекурсивно?
  • Как проверить, монтируется ли файловая система с помощью скрипта
  • Сценарий оболочки для назначения значений из таблицы поиска слишком медленный
  • Удалите строку, используя определенные значения (-)
  • zsh: исключение файлов из шаблона
  • Как я могу захватить статус возврата и использовать тройник одновременно в оболочке korn?
  • Как запускать несколько скриптов параллельно
  • ksh + удалить номер из строки
  • У меня есть многострочная строка, которую мне нужно перебрать, но я не использую bash. Совет?
  • Проверяет наличие статуса выхода, отличного от 0, после команды `command || return` недостижимый?
  • Linux и Unix - лучшая ОС в мире.