Все бы ничего, но обычно это приводит с "висящим" процессам и незакрытой сессии, которая тоже зависает.
В этом, конечно, нет ничего страшного, но может зависнуть и процесс ping –s 50000 http://www.ru,
а это уже неприятно.
Убей его.
Допустим, из зависших процессов нужно убить именно ping.
Находим его среди процессов и определяем его pid (Process IDentifier):
# ps ax|grep "ping"
69560 p1 S+ 0:00.01 ping -s 40000 http://www.ru
Число, находящееся в начале строки, и есть этот самый pid, в этом случае - 69560.
Это уникальный идентификатор данного процесса. Зная его можно расправиться с самим процессом.
Поскольку нужно убить процесс, то опять идем за помощью к мануалу:
# man kill
Это и есть мануал по kill(1). С помощью этой команды можно послать сигнал процессу.
Оказывается, что сигналов много и каждый из них имеет свое назначение. Я рассмотрю лишь
два наиболее часто используемых сигнала – это –HUP и –9. Не странно ли, что один сигнал
отображается в числовом виде, а другой в символьном? У каждого числового сигнала есть
символьный аналог для удобства запоминания.
Например –1 это –HUP, а –9 это –KILL.
Итак, все-таки процесс убить придется.
Его pid уже неизвестен, из man видим синтаксис, поэтому:
# kill –9 69560
Я выбрал –9, потому что мне нужно обязательно завершить этот процесс,
а сигнал –KILL не может быть отловлен и проигнорирован.
На самом деле сигнал –HUP должен интересовать тебя больше, чем даже –9.
Допустим, у нас запущен прокси squid на сервере и что-то изменено в конфигурационном файле,
но работающая программа об этом ничего не знает.
Не будет же она постоянно перечитывать конфигурационный файл отслеживая изменения.
Можно, конечно, убить процесс и запустить squid снова, но это ниже твоего достоинства.
Лучше подать процессу сигнал о том, что конфигурационный файл изменился и что его нужно прочитать.
Делается это опять же просто:
# kill –HUP pid
где pid – это идентификатор процесса, которому нужно подать сигнал.
Конечно, идентификаторы - это хорошо, но не каждый человек способен сходу запомнить пятизначное число.
Нужно посмотреть в таблицу процессов, найти нужный pid, скопировать или вписать его снова на консоль.
Это долго, да и не всегда удобно.
Тебя ждут более важные дела, а для свободы твоей гениальности придумана команда killall.
Все то, что было сотворено с ping, можно было сделать проще:
# killall –9 ping
И даже не нужно было бы смотреть список процессов.
Эта команда убьет все процессы ping, что не всегда желательно.
Если вдруг на другой консоли сидит какой-то человек, например, мой знакомый по имени r1c, и кого-то пингует,
то убийству своего собственного процесса он не порадуется.
Это мокрое дело произойдет тогда, когда мы с ним будем работать от имени одного пользователя или когда я буду работать под root’ом.
В том случае, если я не root и пытаюсь послать сигнал не моему процессу, мне просто будет отказано в доступе.
А что сделать, чтобы не разозлить r1c’а? У команды killall есть два замечательных параметра –u и –t.
Параметр –u ограничивает процессы, которым будет послан сигнал, по пользователю.
То есть нужно написать:
# killall –u root –9 ping
И теперь будут убиты все процессы ping, которые запущены от имени root’а.
Второй параметр может понадобиться, если захочешь поиздеваться над каким-либо пользователем. –t ограничивает процессы по терминалу.
Что это значит и как это нам поможет?
Используя команду
# w
можно добраться до списка пользователей, которые работают в системе на данный момент.
Итак, мы видим колонку TTY.
Это и есть имя терминала, за которым работает пользователь (терминал может быть как виртуальный, так и физический; в этом случае неважно).
Подмечаем, что товарищ r1c работает за терминалом p2. Выполнив команду
# killall –t p2 –9 bash
сбрасываем r1c’а с консоли (при условии, что default-шелл у r1c’а именно bash).