我设置了以下 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)
我究竟做错了什么?
答案1
我建议你采用另一种方式来照顾失败的服务:普斯蒙。这是一个用 Perl 编写的小型守护进程,具有 Apache 风格的配置文件。它允许您定义各种条件,从确保进程处于活动状态到进程消耗过多 RAM/CPU 时重新启动。重新启动将比当前 cron 可能延迟 10 分钟更快发生。
它还可以向您发送电子邮件/记录其运行的事件,这样您就可以看到该过程重新启动的频率(如果您愿意的话)。
答案2
Ubuntu 使用暴发户控制守护进程。请参阅man 5 init
。 这里有一个社区 HowTo和一个维基百科条目。
查看一些现有文件/etc/init.d
作为您自己的liveinstance.conf
文件的模型。特别注意文件开头所需的注释部分。
至于为什么你的脚本没有起到作用cron
,凯是正确的,这通常是环境上的差异。您必须确保设置为$PATH
包含您需要的任何不在默认目录中的目录$PATH
,或者使用完全指定的目录来存放您使用的脚本和实用程序。
答案3
将 crontab 中的行更改为如下所示(或您在其中编写脚本的任何 shell):
*/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