Как узнать, запущен ли процесс, но произошел сбой в Linux - PullRequest
0 голосов
/ 26 мая 2009

Рассмотрим следующую ситуацию: - Я использую Linux. Я сомневаюсь, что мое приложение упало. Я не включил дамп ядра. В журнале нет информации.

Как я могу быть уверен, что после перезагрузки системы мое приложение было запущено, но теперь оно не запущено, потому что оно зависло.

Мое приложение настроено как служба, написанная на C / C ++.

В каком-то смысле: как я могу получить все имена процессов / служб, которые выполнялись с момента запуска системы? Возможно ли это вообще?

Я знаю, что могу включить ведение журнала и снова запустить процесс, чтобы получить сбой.

Ответы [ 8 ]

6 голосов
/ 26 мая 2009

Эта функция включена в ядро ​​Linux. Это называется: учет процессов BSD.

5 голосов
/ 26 мая 2009

Обычной практикой является наличие pid-файла для вашего демона (/var/run/$NAME.pid), в котором вы можете найти его идентификатор процесса, не анализируя дерево процесса вручную. Затем вы можете либо проверить состояние этого процесса, либо заставить своего демона реагировать на сигнал (обычно SIGHUP), и сообщить о его состоянии. Рекомендуется убедиться, что этот pid все еще принадлежит вашему процессу, и самый простой способ - проверить /proc/$PID/cmdline.

.

Добавление: Если вы используете только более новую версию Fedora или Ubuntu, ваша система инициализации upstart имеет встроенные функции мониторинга и запуска.

Как отметил @ emg-2, учет процессов BSD доступен, но я не думаю, что это правильный подход для этой ситуации.

2 голосов
/ 26 мая 2009

Я бы порекомендовал вам записать тот факт, что вы начали в какой-то файл журнала, либо частный, который перезаписывается при каждом запуске, либо один через syslogd .

Кроме того, вы можете регистрировать сердцебиение с отметкой времени, чтобы точно знать, когда оно произошло.

1 голос
/ 26 мая 2009

Демоны должны всегда: 1) Запишите процесс текущего запущенного экземпляра в /var/run/$NAME.pid, используя getpid () (man getpid) или эквивалентную команду для вашего языка. 2) Записать стандартный файл журнала в /var/log/$NAME.log (большие файлы журнала следует разбить на .0.log для текущих запущенных журналов вместе с .X.log.gz для других журналов, где X - число пониже быть более свежим) 3) / Должен / иметь LSB-совместимый сценарий запуска, принимающий хотя бы состояние остановки запуска и флаги перезапуска. С помощью статуса можно проверить, работает ли демон.

1 голос
/ 26 мая 2009

Как упоминает JimB, у вас есть демон, пишущий файл PID. Вы можете определить, работает он или нет, отправив ему сигнал 0, либо с помощью системного вызова kill(2), либо с помощью программы kill(1). Статус возврата скажет вам, существует ли процесс с этим PID.

1 голос
/ 26 мая 2009

вы, вероятно, можете сделать приманку, то есть сценарий приложения или оболочки, который является просто оболочкой для настоящего приложения, но добавляет некоторую регистрацию, такую ​​как «Приложение запущено». Затем вы изменяете имя вашего оригинального приложения и присваиваете оригинальное имя приманке.

0 голосов
/ 27 мая 2009

Если ваше приложение упало, его нельзя отличить от «ваше приложение никогда не запускалось», если только оно не записано в системный журнал. syslog(3) твой друг.

Чтобы найти свое приложение, вы можете попробовать несколько идей:

  • Посмотрите в /proc файловой системе
  • Запустите команду ps
  • Попробуйте killall appname -0 и проверьте код возврата
0 голосов
/ 26 мая 2009

Я не знаю стандартного способа получения всех имен процессов, которые выполнялись; однако может быть способ сделать это с помощью SystemTap .

Если вы просто хотите контролировать свой процесс, я бы рекомендовал использовать waitid (man 2 wait) после разветвления вместо отсоединения и демонизации.

...