LINUX.ORG.RU

Как перезапустить зависший процесс?

 , ,


0

2

Задача: Консольная прога непрерывно выводит результаты своей работы. Раз в N сек среди разных других строк должно появляться определенное сообщение. (В этой строке появляется слово, которого не бывает в других.) Если оно не появилось (а другие строки сыпятся) - надо перезапустить прогу. Исходники слишком громоздкие для меня, слишком долго буду разбираться... Можно ли это сделать на bash или надо что-то мощнее? perl, например? 20 лет назад ковырялся в freefsd, но все уже стерлось в памяти... Поможете?.. Буду крайне признателен...


Прибить приложение:

$ kill <pid>
или
$ killall <name>

Если упорное и не прибивается, тогда можно пожёсче:

$ kill -9 <pid>
или
$ killall -9 <name>

Но второе не очень рекомендуется.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
my $pid = 1234;
my $timer = 0;
my $logfile = '/path/to/logfile';
open my $LOGFILE, '<', $logfile
  or die("open: $! -- $logfile\n");
while (1) {
  my $line = <$LOGFILE>;
  last unless defined $line; # EOF
  if ($line =~ /word/) {
    $timer = 0;
    next;
  }
  $timer++;
  if ($timer > $limit) {
    kill 'TERM', $pid;
    # запустить процесс обратно, получить его pid
    $timer = 0;
  }
}

типа того

anonymous
()

Послать надо SIGHUP Сигнал SIGHUP (номер 1) изначально был предназначен для того, чтобы информировать программу о потере связи с управляющим терминалом (терминалы часто подключались к системе с помощью модемов, так что название сигнала происходит от hung up – повесить трубку). Сигнал SIGHUP посылается приложению так же и в том случае, если процесс-лидер сессии завершил свою работу. Многие программы-демоны, у которых нет лидера сессии, так же обрабатывают этот сигнал. В ответ на получение SIGHUP демон обычно перезапускается (или просто повторно читает файл конфигурации). По умолчанию программа, получившая этот сигнал, завершается.

Смотри man kill Killall [имя программы] -HUP

sova ★★
()
Ответ на: комментарий от sova

По умолчанию программа, получившая этот сигнал, завершается.

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

Black_Shadow ★★★★★
()
Ответ на: комментарий от Black_Shadow

По умолчанию программа, получившая сигнал [HUP], завершается.

Хм. Вот честно, ни разу не встречал такого поведения.

Очень странно. Тут даже не поймешь, какой пример лучше привести — они почти все себя так ведут: bash(1), emacs(1), cp(1) и так далее.

В худшем случае не реагируют никак

Можно пример?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Очень странно. Тут даже не поймешь, какой пример лучше привести — они почти все себя так ведут: bash(1), emacs(1), cp(1) и так далее.

И правда.

Black_Shadow ★★★★★
()
Ответ на: комментарий от Zmicier

Можно пример?

Да я не помню уже. Мне, видимо, ни разу не пришло в голову послать SIGHUP bash-скрипту, в основном, всяким демонам, которые могут перечитать конфиг и продолжить работать. Почему-то мне запало в память, что на это реагируют не все, некоторые при этом продолжают работать. Но вот реальных примеров привести не могу. В общем, я, видимо, был не прав.

Black_Shadow ★★★★★
()
Последнее исправление: Black_Shadow (всего исправлений: 1)
Ответ на: комментарий от Black_Shadow

не, видимо, ни разу не пришло в голову послать SIGHUP bash-скрипту

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

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.