Назад | Перейти на главную страницу

freebsd создает скрипт, чтобы проверить, активна ли служба, и запустить службу, если нет

Дело вот в чем: я использую веб-сервер 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, отправит вам уведомления по электронной почте, и вы можете указать проверку работоспособности, чтобы убедиться, что приложение работает правильно.

http://mmonit.com/monit/

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

#!/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