Дело вот в чем: я использую веб-сервер freebsd с apache solr на пристани
время от времени (несколько раз в месяц) пристань закрывается, и мне приходится перезапускать ее, набрав:
service jetty start
Я новичок в создании сценариев unix. Конечно, я должен проверить, почему служба останавливается, но для быстрого исправления я не возражаю, чтобы cron запускался каждые полчаса, чтобы проверять, работает ли служба еще.
Я нашел это на интернет сайт но я не совсем понимаю, что он делает, поэтому я не могу изменить его под свои нужды.
# check rc script supports status
${SERVICE} 2>&1 | /usr/bin/grep '|status|poll' >/dev/null
if [ $? -eq 0 ]
then
# check status
STATUS=$(${SERVICE} status)
if [ $? -gt 0 ]
then
# service not running try to start
echo ${STATUS}
${SERVICE} start
${SERVICE} status
fi
fi
Итак, вот что я могу сделать из приведенного выше кода:
{СЕРВИС} - это переменная, поэтому я могу заменить ее на «сервисный причал»?
something gets thrown away :)
if [something -equals 0]
if something > 0
starting service
fi
fi
что значит 2>&1
значит / делать?
ИЛИ, может быть, лучше просто запустить service jetty start
из cron? Потому что, если он уже запущен, я получаю ответ, который уже запущен.
Попробуйте этот способ со своего терминала. Если он работает, поместите его в crontab.
echo "PASSWORD" | sudo -S service jetty status && echo "Jetty is running" || sudo service jetty start
К вашему сведению:
||
означает логичный OR
и &&
означает логичный AND
2>&1
означает перенаправление STDERR
к STDOUT
0
это GOOD
статус выхода почти в каждой программе (большинство программистов программируют именно так). Так что если service jetty
status
выходит без ошибок, это просто эхо Jetty is
. В противном случае он запустит службу.
running
sudo -S
- Со страницы руководства: - «Параметр -S (stdin) заставляет sudo читать пароль со стандартного ввода, а не с терминального устройства. После пароля должен стоять символ новой строки».
Вместо того, чтобы создавать службу в crontab, вы можете добавить небольшой демон, чтобы проверить, работает ли служба, и перезагрузить ее, когда это не так. Используя условие проверки Suku, вы можете создать сценарий небольшого демона следующим образом:
#!/bin/sh
reloader() {
while :
do
sleep 5
service httpd jetty || sudo service jetty start
done
}
reloader &
Этот сценарий будет каждые 5 секунд проверять, запущена ли ваша служба, и не потребляет много ресурсов процессора. Это более точно, чем работа в crontab.
Запуск этого сценария от имени пользователя root вместо помещения пароля в виде открытого текста в самом сценарии может быть более безопасным и не менее эффективным.
Вы придумали что-то вроде monit? он ответит намного быстрее, чем задание cron, отправит вам уведомления по электронной почте, и вы можете указать проверку работоспособности, чтобы убедиться, что приложение работает правильно.
Я бы использовал более полный сценарий, который хранит идентификатор процесса и намного безопаснее.
#!/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
Как вы сказали в своем вопросе, вам необходимо выяснить причину остановки вашего сервиса.
В любом случае вы можете попробовать контролировать. Это демон, который можно настроить для мониторинга ваших служб и перезапуска при необходимости. Так что писать для этого скрипт не нужно. Кроме того, ведение журнала помогает узнать, когда служба остановлена и перезапущена.
Команда 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