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
相关产品推荐
相关产品推荐

