Почему «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 по умолчанию.

  • Как выводить строки файла после поиска и grep?
  • Ждите ключа в сценарии оболочки, который может быть отправлен в / bin / bash
  • Как передать логику в скрипте и поддерживать читаемость?
  • Как grep над переменной
  • Отложить переменное расширение до подоболочки
  • Как ssh в удаленном ящике, запустите команду и продолжайте ее работу после отключения
  • Автоматический запуск определенных скриптов при первом входе в систему / при запуске ПК
  • Загрузка нескольких похожих URL-адресов с использованием скобок
  • Ошибка при подсчете символов в файле
  • Rc.local не работает правильно команд
  • Запуск сценария на Debian 8 (Jessie) с помощью etherwake не будет работать
  • Interesting Posts

    Установка с использованием синаптических игнорирующих зависимостей

    Команда ведет себя по-разному при сохранении в файле * .sh

    Feed GPG с ответами

    Как перечислять все команды, содержащиеся в определенном пакете rpm?

    Удаление соответствующего регулярного выражения из имени файла

    Облачный сервер: какой MTA (exim / postfix / etc.) Для какой ОС (Linux / FreeBSD)

    Разрешения 'setfacl' не применяются к каталогам, созданным git clone?

    как уменьшить непригодный размер LVM PV до минимума?

    Oneliner для нарезки изображения?

    Как перенаправить эти символические ссылки после перемещения системы?

    CentOS: установить пакеты, перечисленные в текстовом файле?

    Увеличивает ли размер моей арки при установке обновлений?

    Нет IP-адреса в VMware, работающем в CentOS 7

    Как распаковать, изменить, перестроить и установить SRPM

    Какой хороший и бесплатный инструмент диаграмм ER для Linux, доступный через веб-интерфейс?

    Linux и Unix - лучшая ОС в мире.