У меня настроен следующий crontab, чтобы автоматически запускать сервер в случае сбоя ('start' не действует, если он уже запущен):
root@www:/home/admin# crontab -l
*/10 * * * * /var/foo/live/foo25/bin/liveinstance1 start >> /dev/null 2>&1
# */10 * * * * /var/foo/live/foo25/bin/liveinstance2 start >> /dev/null 2>&1
*/10 * * * * /var/foo/live/foo25/bin/livezeoserver start >> /dev/null 2>&1
(Вторая строка специально закомментирована, поскольку второй экземпляр пока не используется)
Эти команды работают нормально, когда вводятся индивидуально от имени этого пользователя. Однако, когда сервер выходит из строя, это задание cron никогда не запускает его.
Журналы cron не показывают ничего плохого в то время, когда сервер не работал (по крайней мере, на мой взгляд новичка:
Aug 26 09:28:01 www /USR/SBIN/CRON[27005]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Aug 26 09:30:01 www /USR/SBIN/CRON[27023]: (root) CMD (/var/foo/live/foo25/bin/livezeoserver start >> /dev/null 2>&1)
Aug 26 09:30:01 www /USR/SBIN/CRON[27026]: (root) CMD (/var/foo/live/foo25/bin/liveinstance1 start >> /dev/null 2>&1)
Aug 26 09:40:01 www /USR/SBIN/CRON[27126]: (root) CMD (/var/foo/live/foo25/bin/livezeoserver start >> /dev/null 2>&1)
Aug 26 09:40:01 www /USR/SBIN/CRON[27129]: (root) CMD (/var/foo/live/foo25/bin/liveinstance1 start >> /dev/null 2>&1)
Что я делаю не так?
Ubuntu использует Выскочка управлять демонами. Видеть man 5 init
. Вот сообщество HowTo и Запись в Википедии.
Посмотрите на некоторые существующие файлы в /etc/init.d
как модели для ваших собственных liveinstance.conf
файл. Обратите особое внимание на обязательный раздел комментариев в начале файлов.
Что касается того, почему ваш сценарий не работает как cron
работа Кхай правильно, что обычно это разница в окружающей среде. Вы должны убедиться, что вы установили $PATH
для включения любых каталогов, которые вам требуются, но не по умолчанию $PATH
или используйте полностью определенные каталоги для скриптов и утилит, которые вы используете.
Я предложу вам другой способ присмотра за неисправным сервисом: psmon. Это небольшой демон, написанный на Perl, имеющий стильный конфигурационный файл Apache. Он позволяет вам определять все виды условий, от простого подтверждения работоспособности процесса до его перезапуска, если процесс потребляет слишком много ОЗУ / ЦП. Перезагрузка произойдет раньше, чем после возможной 10-минутной задержки с вашим текущим cron.
Он также может отправлять вам по электронной почте / регистрировать запущенные события, чтобы вы могли видеть, как часто процесс перезапускается, если хотите.
Измените строку в crontab, чтобы она выглядела так (или в любой другой оболочке, в которой вы написали скрипт):
*/10 * * * * /bin/bash /var/foo/live/foo25/bin/liveinstance1 start >> /dev/null 2>&1
Также вам нужно добавить свой путь к crontab, запустить этот скрипт:
#!/bin/bash
#
# Date: August 22, 2013
# Author: Steve Stonebraker
# File: add_current_shell_and_path_to_crontab.sh
# Description: Add current user's shell and path to crontab
# Source: http://brakertech.com/add-current-path-to-crontab
# Github: https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
# function that is called when the script exits (cleans up our tmp.cron file)
function finish { [ -e "tmp.cron" ] && rm tmp.cron; }
#whenver the script exits call the function "finish"
trap finish EXIT
########################################
# pretty printing functions
function print_status { echo -e "\x1B[01;34m[*]\x1B[0m $1"; }
function print_good { echo -e "\x1B[01;32m[*]\x1B[0m $1"; }
function print_error { echo -e "\x1B[01;31m[*]\x1B[0m $1"; }
function print_notification { echo -e "\x1B[01;33m[*]\x1B[0m $1"; }
function printline {
hr=-------------------------------------------------------------------------------------------------------------------------------
printf '%s\n' "${hr:0:${COLUMNS:-$(tput cols)}}"
}
####################################
# print message and exit program
function die { print_error "$1"; exit 1; }
####################################
# user must have at least one job in their crontab
function require_gt1_user_crontab_job {
crontab -l &> /dev/null
[ $? -ne 0 ] && die "Script requires you have at least one user crontab job!"
}
####################################
# Add current shell and path to user's crontab
function add_shell_path_to_crontab {
#print info about what's being added
print_notification "Current SHELL: ${SHELL}"
print_notification "Current PATH: ${PATH}"
#Add current shell and path to crontab
print_status "Adding current SHELL and PATH to crontab \nold crontab:"
printline; crontab -l; printline
#keep old comments but start new crontab file
crontab -l | grep "^#" > tmp.cron
#Add our current shell and path to the new crontab file
echo -e "SHELL=${SHELL}\nPATH=${PATH}\n" >> tmp.cron
#Add old crontab entries but ignore comments or any shell or path statements
crontab -l | grep -v "^#" | grep -v "SHELL" | grep -v "PATH" >> tmp.cron
#load up the new crontab we just created
crontab tmp.cron
#Display new crontab
print_good "New crontab:"
printline; crontab -l; printline
}
require_gt1_user_crontab_job
add_shell_path_to_crontab