Crontab 失败,但日志中没有任何错误

Crontab 失败,但日志中没有任何错误

我设置了以下 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

相关内容