crontab 无法通过工作脚本启动服务

crontab 无法通过工作脚本启动服务

我的脚本单独运行时可以运行,但通过 crontab 运行时不行

定时任务

[root@someserver:/]# crontab -l
SHELL=/bin/bash
PATH=/usr/lib64/qt-3.3/bin:/home/ec2/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

*/1 * * * * /bin/bash /opt/scripts/check_beaver_status.sh

有问题的剧本

#!/bin/bash

function check_if_beaver_running () {
        current_script=`basename $0`
        process_name="beaver"
        /bin/ps aux | /bin/grep "${process_name}" | /bin/grep -v 'grep' | /bin/grep -v "$current_script"

         if [ $? -eq 0 ]; then
             echo "${process_name} running"
         else
             echo "${process_name}: not running, starting..."
             if [ -f /var/run/logstash_beaver.pid ] ; then
                         /bin/rm -f /var/run/logstash_beaver.pid
             fi
             /sbin/service beaver start
         fi
}
check_if_beaver_running

答案1

Crond 没有运行。

[root@someserver:]# service crond status
crond is stopped

[root@someserver:]# service crond start

[root@someserver:]# chkconfig crond on

我还将脚本更改为:

#!/bin/bash
# when running in crontab:
# SHELL=/bin/bash
# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# */10 * * * * /bin/bash beaver_ensure_running.sh

START=false
readarray -t PIDS < <(exec pgrep -x beaver)

function stop_beaver {
    /usr/sbin/service beaver stop
    sleep 5s  ## Optionally wait for processes to stop.
    kill -s SIGTERM "${PIDS[@]}" ## Perhaps force another signal to them if it doesn't work with defuncts.
    sleep 5s  ## Optionally wait for processes to stop.
    kill -s SIGKILL "${PIDS[@]}" ## Perhaps force another signal to them if it doesn't work with defuncts.
    START=true
}
if [[ ${#PIDS[@]} -eq 0 ]]; then
    echo "No beaver process was found."
    START=true
elif [[ ${#PIDS[@]} -eq 1 ]]; then
    echo "Processes found: ${PIDS[*]}"
    echo "Only one beaver process found."
    stop_beaver
elif ps -fp "${PIDS[@]}" | fgrep -F '<defunct>' >/dev/null; then
    echo "Processes found: ${PIDS[*]}"
    echo "Defunct beaver process found."
    stop_beaver
else
    echo "Processes found: ${PIDS[*]}"
fi
[[ $START == true ]] && /usr/sbin/service beaver start

答案2

我对这个问题的答案非常感兴趣,所以让我帮你诊断一下。

尝试将 cron 更改为:

*/1 * * * * /bin/bash -x /opt/scripts/check_beaver_status.sh > /tmp/crondiag.log 2>&1

还添加命令:

env

既位于脚本的顶部,也位于脚本中的函数调用的底部。

让它运行一次并与我们分享结果。也许在 pastie.org 或其他地方。

相关内容