You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本命令行运行正常但Cron执行时异常重启求助

问题:Cron定时执行脚本时误触发重启操作

脚本在命令行运行时可正确检测程序退出码,仅在目标程序异常(退出码≠0)时执行重启;但通过Cron定时任务执行时,无论目标程序是否正常,都会触发重启逻辑。

Cron任务配置

*/5 * * * * root /root/scripts/check.sh

原脚本内容

#!/bin/sh

check_cmd="omreport chassis memory"
srvadmin_path="/opt/dell/srvadmin/sbin/srvadmin-services.sh"

if [ -x $srvadmin_path ]; then
    $check_cmd > /dev/null 2>&1
    if [ $? -ne 0 ]; then

### Clear semaphores before restart the program ###
        for i in $(ipcs -st | grep -v oracle | awk '(NR>3)' |cut -d ' ' -f 1)
            do ipcrm -s $i; done && $srvadmin_path restart &&\
            systemctl restart nrpe && logger -t omsa -p local0.info "Restart OMSA due to an error"
    fi
fi

问题原因

Cron的运行环境变量远少于命令行环境,omreport命令大概率不在Cron默认的PATH中,导致执行$check_cmd时直接报错(退出码非0),进而触发重启逻辑。脚本中未指定omreport的完整路径,依赖环境PATH查找命令,这在Cron环境中会失效。

修复方案

1. 指定omreport的完整路径

先在命令行执行which omreport获取命令的绝对路径,比如结果为/opt/dell/srvadmin/bin/omreport,修改脚本中的check_cmd:

check_cmd="/opt/dell/srvadmin/bin/omreport chassis memory"

2. 给脚本补充必要环境变量(可选)

在脚本开头导入系统环境变量,确保命令能被正确找到:

#!/bin/sh
# 加载系统及用户环境变量
. /etc/profile
. ~/.profile

check_cmd="/opt/dell/srvadmin/bin/omreport chassis memory"
srvadmin_path="/opt/dell/srvadmin/sbin/srvadmin-services.sh"
# 后续代码保持不变

3. 调试脚本执行日志

临时修改脚本,将执行过程输出到日志文件,方便排查问题:

#!/bin/sh
# 把所有输出重定向到日志文件
exec >> /tmp/omsa_check.log 2>&1
echo "=== 执行时间: $(date) ==="

check_cmd="/opt/dell/srvadmin/bin/omreport chassis memory"
srvadmin_path="/opt/dell/srvadmin/sbin/srvadmin-services.sh"

if [ -x "$srvadmin_path" ]; then
    echo "执行检测命令: $check_cmd"
    $check_cmd
    exit_code=$?
    echo "检测命令退出码: $exit_code"
    if [ $exit_code -ne 0 ]; then
        echo "触发重启操作..."
        for i in $(ipcs -st | grep -v oracle | awk '(NR>3)' |cut -d ' ' -f 1)
            do ipcrm -s $i; done && $srvadmin_path restart &&\
            systemctl restart nrpe && logger -t omsa -p local0.info "Restart OMSA due to an error"
    fi
else
    echo "错误: srvadmin-services.sh 不可执行"
fi

执行后查看/tmp/omsa_check.log,确认命令是否正常执行、退出码是否符合预期。

4. 在脚本中明确设置PATH

直接在脚本开头添加必要的路径,避免依赖环境变量:

#!/bin/sh
# 设置包含OMSA命令的PATH
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/dell/srvadmin/bin:/opt/dell/srvadmin/sbin

check_cmd="omreport chassis memory"
srvadmin_path="/opt/dell/srvadmin/sbin/srvadmin-services.sh"
# 后续代码保持不变

内容的提问来源于stack exchange,提问作者VmeansVendetta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:35:30