首页 > 解决方案 > Bash 脚本运行,但主要命令没有输出并且未执行

问题描述

我正在设置一个 cron 作业,它是一个包含以下内容的 bash 脚本:

#!/bin/bash
NUM_CONTAINERS=$(docker ps -q | wc -l)
if [ $NUM_CONTAINERS -lt 40 ]
then
  echo "Time: $(date). Restart containers." 
  cd /opt 
  pwd
  sudo docker kill $(docker ps -q)
  docker-compose up -d
  echo "Completed." 
else
  echo Nothing to do
fi

输出附加到日志文件:

>> cron.log

但是 cron 文件中的输出仅显示:

Time: Sun Aug 15 10:50:01 UTC 2021. Restart containers. 
/opt
Completed.

这两个命令似乎都没有执行,因为我的容器也没有看到任何变化。这 2 个不工作的命令在独立的 .sh 脚本中运行良好,但没有条件。我究竟做错了什么?

运行 cron 的用户有 sudo 权限,我们可以看到第二个 echo 打印。

标签: bash

解决方案


很多时候,在外部起作用的东西在内部cron不起作用,因为环境的设置方式不同。 cron

您通常应该捕获标准输出错误,以查看是否出现问题。

例如,>> cron.log 2>&1在您的crontab文件中使用,这将捕获两者。

至少有可能不在docker您的路径中,或者即使是,docker命令由于其他原因无法正常工作(因为您只捕获标准输出,所以您没有看到)。

如果确实是问题,捕获标准错误应该有助于解决这个问题。


顺便说一句,我倾向于在cron脚本中使用完整路径名,或者在开始时设置非常有限的环境以确保一切正常(一旦我确定了它为什么不能正常工作)。


推荐阅读