Я пытаюсь обеспечить выполнение сценария на сервере разработки. Он собирает статистику и предоставляет веб-сервис, поэтому он должен сохраняться, но несколько раз в день он умирает по неизвестным причинам. Когда мы замечаем, что просто запускаем его снова, это уже задница, и у некоторых пользователей нет разрешения (или ноу-хау) на его запуск.
Программист во мне хочет потратить несколько часов на то, чтобы разобраться в проблеме, но занятой человек во мне думает, что должен быть простой способ определить, не запущено ли приложение, и запустить его снова.
Я знаю , что я мог бы хроны-скрипт п.с. через Grep:
ps -A | grep appname
Но опять же, это еще один час моей жизни, потраченный на то, что уже должно существовать ... Разве нет готового приложения, в которое я могу передать исполняемый файл (необязательно с аргументами), и которое будет поддерживать процесс бесконечно?
В случае, если это имеет значение, это Ubuntu.
/etc/inittab
.Ответы:
Примечание: Upstart находится в режиме обслуживания и был оставлен Ubuntu, который использует systemd. Чтобы узнать подробности о том, как написать определение службы, следует обратиться к руководству по systemd .
Поскольку вы используете Ubuntu, вас может заинтересовать Upstart , который заменил традиционный sysV init . Одна из ключевых особенностей заключается в том, что он может перезапустить службу, если она неожиданно умирает. Fedora перешла на выскочку, а Debian находится в экспериментальной стадии, так что, возможно, стоит изучить ее.
Однако в данной ситуации это может быть излишним, поскольку для реализации сценария cron потребуется 2 минуты.
источник
Я использовал простой скрипт с cron, чтобы убедиться, что программа работает. Если это не так, он запустит его. Возможно, это не идеальное решение, которое вы ищете, но оно простое и работает достаточно хорошо.
#!/bin/bash #make-run.sh #make sure a process is always running. export DISPLAY=:0 #needed if you are running a simple gui app. process=YourProcessName makerun="/usr/bin/program" if ps ax | grep -v grep | grep $process > /dev/null then exit else $makerun & fi exit
Затем добавляйте задание cron каждую минуту или каждые 5 минут.
источник
process name
бы, если бы я хотел, чтобы скрипт Python продолжал работать?ps ax | grep XXX
чтобы перечислить только ваш процесс, тогда будет XXX.* * * * * ps aux|grep -v grep|grep -q YourProcessName || /usr/bin/program &
Монит для этого идеально подходит :)
Вы можете написать простые файлы конфигурации, которые сообщают monit, что нужно смотреть, например, порт TCP, файл PID и т. Д.
monit выполнит указанную вами команду, когда процесс, который он отслеживает, недоступен / использует слишком много памяти / слишком долго привязан к процессору / и т. д. Также появится уведомление по электронной почте о том, что произошло и можно ли что-нибудь с этим поделать.
Мы используем его, чтобы поддерживать загрузку наших веб-сайтов, одновременно давая нам раннее предупреждение, когда что-то идет не так.
- Ваш верный сотрудник, Монит
источник
Если вы используете дистрибутив на основе systemd, такой как Fedora и недавние выпуски Ubuntu, вы можете использовать возможность systemd «Restart» для служб. Он может быть настроен как системная служба или как пользовательская служба, если ей нужно управлять и запускать от имени конкретного пользователя, что более вероятно в конкретной ситуации OP.
Вариант перезапуска занимает один из
no
,on-success
,on-failure
,on-abnormal
,on-watchdog
,on-abort
, илиalways
.Чтобы запустить его как пользователь, просто поместите файл, подобный следующему, в
~/.config/systemd/user/something.service
:тогда:
Никаких прав root / модификации системных файлов, никаких заданий cron, ничего не нужно устанавливать, чертовски гибко (см. Все соответствующие опции сервисов в документации).
См. Также https://wiki.archlinux.org/index.php/Systemd/User для получения дополнительной информации об использовании экземпляра systemd для каждого пользователя.
источник
Я использовал из cron "killall -0 programname || /etc/init.d/programname start". kill приведет к ошибке, если процесс не существует. Если он существует, он доставит процессу нулевой сигнал (который ядро проигнорирует и не будет беспокоиться о передаче).
Эту идиому легко запомнить (ИМХО). Обычно я использую это, пока все еще пытаюсь выяснить, почему сама служба дает сбой. ИМХО программа не должна неожиданно исчезать :)
источник
Поместите свой запуск в цикл - поэтому, когда он завершится, он запустится снова ... while (true) {run my app ..}
источник
По какой-то причине я не мог заставить работать решение Криса Вендта , и его было трудно отладить. Это почти то же самое, но легче отлаживать, исключает bash из сопоставления с образцом. Для отладки просто запустите:
bash ./root/makerun-mysql.sh
. В следующем примере с mysql-server просто замените значение переменных дляprocess
иmakerun
для вашего процесса.nano /root/makerun-mysql.sh
):#!/bin/bash process="mysql" makerun="/etc/init.d/mysql restart" if ps ax | grep -v grep | grep -v bash | grep --quiet $process then printf "Process '%s' is running.\n" "$process" exit else printf "Starting process '%s' with command '%s'.\n" "$process" "$makerun" $makerun fi exit
Убедитесь, что он исполняемый, добавив соответствующие права доступа к файлу (т.е.
chmod 700 /root/makerun-mysql.sh
)Затем добавьте это в свой crontab (
crontab -e
):# Keep processes running every 5 minutes */5 * * * * bash /root/makerun-mysql.sh
источник
supervise
Инструмент отdaemontools
бы мое предпочтение - но тогда все пишет Дэн J Bernstein мои предпочтения :)http://cr.yp.to/daemontools/supervise.html
Вы должны создать определенную структуру каталогов для сценария запуска вашего приложения, но она очень проста в использовании.
источник
Прежде всего, как запустить это приложение? Разветвляется на фон? Это запускается с nohup .. и тд? Если последнее, проверьте, почему он умер в nohup.out, если первый - ведение журнала сборки.
Что касается вашего основного вопроса: вы можете cron или запустить другой процесс в фоновом режиме (не лучший выбор) и использовать pidof в bashscript, достаточно просто:
источник
Вы можете сделать это службой, запускаемой из inittab (хотя некоторые Linux перешли на что-то более новое в /etc/event.d). Эти встроенные системы гарантируют, что ваша служба будет работать без написания собственных сценариев или установки чего-то нового.
источник
Это работа для DMD (демона мониторинга). их несколько; но я обычно просто пишу сценарий, который проверяет, запущен ли демон, и запускается, если нет, и помещаю его в cron для запуска каждую минуту.
источник
Check out »,
nanny
на который есть ссылка в главе 9 (p197 или около того) « Unix Hater's Handbook » (один из нескольких источников книги в формате PDF).источник
Хороший и простой способ сделать это:
Если он не работает, он запускается, а если он работает, то нет. В любом случае ваш сервер всегда будет работать.
источник
Я думаю, что лучшим решением будет, если вы тоже протестируете функцию. Например, если вам нужно было протестировать apache, недостаточно только проверить, существуют ли в системах процессы «apache».
Если вы хотите проверить, все ли в порядке с apache, попробуйте загрузить простую веб-страницу и проверьте, отображается ли ваш уникальный код на выходе.
Если нет, убейте apache с помощью -9, а затем выполните перезапуск. И отправьте письмо в корень (который является адресом для пересылки почты в корень компании / сервера / проекта).
источник
Это еще проще:
Однако вы должны помнить, чтобы убедиться, что имя процесса уникально.
источник
Установить минутный мониторинг cronjob можно так:
Недостатком является то, что вводимые вами имена приложений должны быть найдены в
ps aux|grep "appname"
выводе и в то же время иметь возможность запускаться с этим именем:"appname" &
источник