Преодолеть плохо ведущий себя процесс Linux? - PullRequest
1 голос
/ 03 июня 2009

У меня есть плохо ведущий процесс (запущенный с помощью пользовательской команды), который продолжает умирать с нерегулярными интервалами, и мне нужно, чтобы он оставался в живых, пока я не убью его вручную. Вот мое прямое, но, вероятно, глупое решение:

#!/bin/bash

if [ -z $1 ]
then
 echo "Usage: /s98ize.sh <process name>"
 exit
fi

#start of the 'polling' loop

while [ 1 ]
do

pgrep $1

if [ $? -eq 0 ]
then
 echo "Already running"
else
 # If process has died or not started, start it
 $1
 # FIXME: I have not done any error checking this script will not catch a
 # unavailable command
fi

done

# end of the polling loop

Суть в следующем: если вышеуказанный процесс запущен, то ничего не делать, иначе запустите его. Весьма очевидным недостатком является то, что он продолжает «опрос». Тем не менее, это служит моей цели.

Когда я пишу это, я думаю, что могу обработать сигнал процесса, чтобы после получения сигнала уничтожения я мог его перезапустить? Что ты думаешь?

Ответы [ 4 ]

4 голосов
/ 03 июня 2009

Рассматривали ли вы программу djb supervise ? Он делает именно это: запускает программу, перезапускает ее, если она выходит, предоставляет средства для управления ею и т. Д.

4 голосов
/ 03 июня 2009

Вы можете поместить его в / etc / inittab, и init (8) автоматически перезапустит его.

Вы можете определить, на каких уровнях запуска запускается процесс, поэтому он не должен запускаться при загрузке. Вы также можете использовать программу наподобие sed (1), чтобы программно редактировать inittab и добавлять к ней строку, а затем указывать init (8) перезаписать файл конфигурации (и запустить вашу программу) с помощью: init q

1 голос
/ 04 июня 2009

Если вы хотите перезапустить процесс, используя скрипт bash, не делайте ошибку, полагаясь на сломанные инструменты, такие как pgrep. Более того, ваш bash-код сильно страдает от разделения слов и неожиданных ошибок расширения пути.

Сделайте это:

#!/usr/bin/env bash

until "$@"; do
    echo "$1 exited with exit code: $?.  Respawning .."
    sleep 1
done

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1007

Также обратите внимание на использование "$@".

Ключевое слово until будет перезапускать ваш процесс до тех пор, пока он не завершится корректно (с кодом выхода 0), что означает, что он завершился без ошибок (возможно, потому что вы попросили его остановить, например, при перезагрузке системы).

Предполагая, что он называется 'respawn' и находится в PATH, используйте его так:

respawn mycommand --foo=bar
1 голос
/ 04 июня 2009

Вместо лечения симптома вы должны попытаться решить проблему . Под этим я подразумеваю выяснить, почему программа «умирает» (падает) и исправить ее, если это возможно (большинство программ для Linux имеют открытый исходный код и позволяют вам точно это делать).

Чтобы найти причину сбоя программы ( wvdial ), вы можете сделать это:

Используйте ulimit -c unlimited в оболочке, где вы запускаете wvdial, чтобы в случае сбоя он генерировал файл ядра, а затем отладил его с помощью gdb --core / path / to / WvDial

Вам может понадобиться сначала установить отладочную информацию для приложений / библиотек в менеджере пакетов, если они еще не установлены.

Если вы не можете (или не хотите) сделать это, вы можете использовать monit для автоматического перезапуска процесса. Вот блог , в котором показано, как использовать monit для веб-сервера.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...