我有以下crontab设置,如果它崩溃自动启动服务器('开始'没有效果,如果它已经运行):
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日志在服务器closures的时候并没有显示出任何不良情况(至less不是我的新手眼睛:
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)
我究竟做错了什么?
我会build议你一个不同的方式来照顾一个失败的服务: psmon 。 这是一个用Perl编写的小型守护进程,有一个Apache时尚的configuration文件。 它可以让你定义所有types的条件,只要确保一个进程是活着的,并重新启动它,如果进程消耗太多的RAM / CPU。 重新启动将发生的方式,比你当前的cron可能的10分钟的延迟。
它还可以向您发送电子邮件/logging其运行的事件,以便您可以查看多久重新启动stream程,如果您愿意的话。
Ubuntu使用Upstart来控制守护进程。 参见man 5 init
。 这是一个社区HowTo和一个维基百科条目 。
查看/etc/init.d
中的一些现有文件作为您自己的liveinstance.conf
文件的模型。 请特别注意文件开始部分所需的注释部分。
至于为什么你的脚本不是作为一个cron
工作, Khai是正确的,它通常是环境的差异。 您必须确保您设置$PATH
以包含任何您不需要的默认$PATH
目录或使用完全指定的目录到您使用的脚本和实用程序。
在crontab中改变行看起来像这样(或者你写脚本的任何shell):
*/10 * * * * /bin/bash /var/foo/live/foo25/bin/liveinstance1 start >> /dev/null 2>&1
另外,您需要将path添加到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