Наилучший вариант состоит в том, чтобы попытаться решить саму проблему и проверку, почему дочерние procceses не завершаются, когда их родитель умирает.
Можно использовать эту команду для выполнения команды удаленно на другой машине:
ssh user@remote_machine command
Конечно, необходимо заменить значения: user, remote_machine, and command
с соответствующими значениями.
Например, можно сделать:
ssh root@remote_machine "killall compute-0-127"
Вы что-нибудь придумали нравится монит? он ответит намного быстрее, чем задание cron, отправит вам уведомления по электронной почте, и вы можете указать проверку работоспособности, чтобы убедиться, что приложение работает правильно.
Вместо создания службы в crontab вы можете добавить небольшой демон, чтобы проверять, запускает ли служба, перезагружая ее, когда он Это не так. Используя условие проверки Suku, вы можете написать сценарий небольшого демона следующим образом:
#!/bin/sh
reloader() {
while :
do
sleep 5
service httpd jetty || sudo service jetty start
done
}
reloader &
Этот сценарий будет каждые 5 секунд проверять, запущена ли ваша служба, и не потребляет много ресурсов ЦП. Это более точно, чем задание в crontab.
Запуск этого сценария от имени пользователя root вместо помещения пароля в виде открытого текста в самом сценарии может быть более безопасным и не менее эффективным.
Как вы сказали в своем вопросе, вам необходимо выяснить причину остановки вашей службы.
В любом случае, вы можете попробовать monit . Это демон, который можно настроить для мониторинга ваших служб и перезапуска при необходимости. Так что писать для этого скрипт не нужно. Кроме того, ведение журнала помогает узнать, когда служба остановлена и перезапущена.
Команда status должна поддерживаться всеми сценариями rc.d. Вы можете использовать этот сценарий для перезапуска мертвых демонов:
. /etc/rc.subr
for service in ${autorestart_services}; do
/usr/local/etc/rc.d/${service} status >/dev/null
if [ $? != 0 ]; then
echo "System service ${service} is down. Try to restart..."
/usr/local/etc/rc.d/${service} restart
fi
done
Я бы использовал более полный сценарий, который хранит идентификатор процесса и намного безопаснее.
#!/bin/bash
processId=$(service jetty start) # Start yetty
processId=$! # stores the process ID of jetty
while sleep 30
do
if kill -0 $processId # Check if process is still running
then
echo >&2 "Process is running."
else
echo >&2 "ERROR - terminated"
break
fi
done
Поместите сценарий в cron и время от времени проверяйте. Дополнительные примеры и полезные руководства см. В @ http://mywiki.wooledge.org/BashFAQ#BashFAQ.2BAC8-042.How_can_I_find_out_if_a_process_is_still_running.3F
Попробуйте этот способ со своего терминала. Если он работает, поместите его в crontab.
echo "PASSWORD" | sudo -S service jetty status && echo "Jetty is running" || sudo service jetty start
FYI:
||
означает логическое ИЛИ
и &&
означает логическое И
2> & 1
означает перенаправление STDERR
на STDOUT
0
- это статус выхода ХОРОШО
почти в каждой программе (большинство
программисты программируют таким образом). Итак, если сервисный причал
статус
завершается без ошибок, будет отображаться только эхо Jetty is
. В противном случае он запустит службу.
работает
sudo -S
- Из справочной страницы: - "Параметр -S (stdin) заставляет sudo читать
пароль со стандартного ввода вместо оконечного устройства. В
После пароля должен стоять символ новой строки. "