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

Наилучший вариант состоит в том, чтобы попытаться решить саму проблему и проверку, почему дочерние procceses не завершаются, когда их родитель умирает.

Можно использовать эту команду для выполнения команды удаленно на другой машине:

ssh user@remote_machine command

Конечно, необходимо заменить значения: user, remote_machine, and command с соответствующими значениями.

Например, можно сделать:

ssh root@remote_machine "killall compute-0-127"
1
задан 10 January 2013 в 14:38
6 ответов

Вы что-нибудь придумали нравится монит? он ответит намного быстрее, чем задание cron, отправит вам уведомления по электронной почте, и вы можете указать проверку работоспособности, чтобы убедиться, что приложение работает правильно.

http://mmonit.com/monit/

1
ответ дан 3 December 2019 в 17:52

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

#!/bin/sh

reloader() {
  while :
  do
      sleep 5
      service httpd jetty || sudo service jetty start
  done
}

reloader &

Этот сценарий будет каждые 5 секунд проверять, запущена ли ваша служба, и не потребляет много ресурсов ЦП. Это более точно, чем задание в crontab.

Запуск этого сценария от имени пользователя root вместо помещения пароля в виде открытого текста в самом сценарии может быть более безопасным и не менее эффективным.

1
ответ дан 3 December 2019 в 17:52

Как вы сказали в своем вопросе, вам необходимо выяснить причину остановки вашей службы.

В любом случае, вы можете попробовать monit . Это демон, который можно настроить для мониторинга ваших служб и перезапуска при необходимости. Так что писать для этого скрипт не нужно. Кроме того, ведение журнала помогает узнать, когда служба остановлена ​​и перезапущена.

0
ответ дан 3 December 2019 в 17:52

Команда 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
0
ответ дан 3 December 2019 в 17:52

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

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

0
ответ дан 3 December 2019 в 17:52

Попробуйте этот способ со своего терминала. Если он работает, поместите его в 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 читать пароль со стандартного ввода вместо оконечного устройства. В После пароля должен стоять символ новой строки. "

2
ответ дан 3 December 2019 в 17:52

Теги

Похожие вопросы