bash - 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 打印。
解决方案
很多时候,在外部起作用的东西在内部cron
不起作用,因为环境的设置方式不同。 cron
您通常应该捕获标准输出和错误,以查看是否出现问题。
例如,>> cron.log 2>&1
在您的crontab
文件中使用,这将捕获两者。
至少有可能不在docker
您的路径中,或者即使是,docker
命令由于其他原因无法正常工作(因为您只捕获标准输出,所以您没有看到)。
如果确实是问题,捕获标准错误应该有助于解决这个问题。
顺便说一句,我倾向于在cron
脚本中使用完整路径名,或者在开始时设置非常有限的环境以确保一切正常(一旦我确定了它为什么不能正常工作)。
推荐阅读
- python - 在python中循环列表并将结果附加到列表中
- javascript - react-native-document-picker 不返回任何内容
- swift - 具有同步定时器和睡眠的操作的串行操作队列
- python - 在 Python 中的 excel 中创建文件夹并从 url 下载图像
- sql-server - 如何授予用户创建用户的权限并将角色仅授予 SQL Server 中的一个数据库
- networking - k8s外部IP SNAT?
- azure - Azure Terraform:没有变化。基础设施是最新的,但没有创建资源并且 terraform Destroy - 命令失败
- tabulator - 制表符中的订单组
- sql - 使用 SQL 解决逻辑问题
- javascript - 禁用鼠标事件反应