Всем привет! Прочитал про killall, что можно завершить все процессы по названию. У данной команды есть еще ключ -w, который нужен чтобы не просто послать сигнал, но и подождать, пока все заданные процессы завершатся.
Подскажите пожалуйста, как это работает? В интернете не нашел конкретно с ключом -w.
У меня откуда-то висят процессы php-cgi, которые запустили почти час назад. Я бы хотел завершить подобные процессы, если они нигде не используются. Поможет ли команда killall -w php-cgi в данном случае? И чтобы не "убить" нужные процессы
Для правильного вопроса надо знать половину ответа
$ man killall
...
killall sends a signal to all processes running any of the specified commands. If no signal
name is specified, SIGTERM is sent.
...
-w, --wait
Wait for all killed processes to die. killall checks once per second if any
of the killed processes still exist and only returns if none are left. Note
that killall may wait forever if the signal was ignored, had no effect, or if
the process stays in zombie state.
rinaz22, То есть killall с ключом -w, как обычно, пошлёт процессам сигнал, но потом не завершится сразу, е будет раз в секунду проверять, что все процессы, которым он послал сигнал, завершились. Как только все процессы завершатся, killall тоже завершится.
На то, прибъёте вы командой killall какой-нибудь важный для себя процесс, или нет ключ -w не влияет абсолютно. Да и никакой другой ключ не влияет. killall пошлёт сигнал всем процессам, попадающим под указанное имя/регулярку. А что вы там указали, ему без разницы.
А в чем тогда разница с ключом и без? Только в том, что с ключом он проверяет каждую секунду?
И если запустить без ключа, работающие процессы завершаться или продолжат работать до конца?
rinaz22, Вы читать умеете? Ещё раз пишу. killall в любом случае пошлёт указанным процессам указанный сигнал. Ключ -w влияет только на то, будет он сам после этого ожидать завершения всех этих процессов или сразу завершится.
kilall -w будет ждать пока закончатся все подоходящие под маску процессы.
если какой из попавших в маску процессов не завершится, killall -w тоже не завершится.
Это не какая-то волшебная команда, которая умеет убивать процессы, это просто отправка SIGNAL, что есть часть архитектурного соглашения POSIX систем.
То есть команда killall пошлет всем указанным процессам указанный сигнал (или SIGTERM по умолчанию), а при указании -w будет ждать, пока все указанные процессы не завершатся, проверяя их наличие раз в секунду.
Если процессы зависли и не завершаются, killall будет ждать вечно.