Cron任务无法执行Bash脚本及Docker Compose命令求助
解决方案
1. 修复Cron任务的执行环境
Cron默认的PATH范围极窄(通常仅包含/usr/bin:/bin),且不会加载用户的bashrc配置,这是脚本在CLI可正常运行但Cron中失效的核心原因。
修改Ansible Cron配置
将job中的sh替换为bash(匹配脚本的shebang声明),同时显式指定完整PATH避免命令找不到,日志改为追加模式防止被清空:
ansible.builtin.cron: name: daily apt upgrade minute: "0" hour: "3" weekday: "6" job: "PATH=/usr/local/bin:/usr/bin:/bin bash /opt/apt_upgrades/update.sh | tee -a /opt/apt_upgrades/log/upgrade.txt 2>&1" state: present
2. 修复Bash脚本中的问题
2.1 确保脚本有执行权限
在Ansible中添加file模块设置脚本权限:
ansible.builtin.file: path: /opt/apt_upgrades/update.sh mode: '0755'
2.2 使用docker-compose绝对路径
先在目标主机执行which docker-compose获取绝对路径(例如/usr/local/bin/docker-compose),替换脚本中的docker-compose命令,并增加目录切换的错误判断:
#!/bin/bash # 替换为实际的docker-compose绝对路径 DOCKER_COMPOSE="/usr/local/bin/docker-compose" # 切换目录时判断是否成功,避免后续命令因目录不存在失效 if cd /opt/docker-compose/; then $DOCKER_COMPOSE down fi # 若Cron以root运行,直接去掉sudo;普通用户需配置sudo免密 apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean | tee -a /opt/apt_upgrades/log/upgrade.txt 2>&1 sleep 5 echo "Current time: $(date +%T)" | tee -a /opt/apt_upgrades/log/upgrade.txt if cd /opt/docker-compose/; then $DOCKER_COMPOSE up --detach fi
2.3 处理sudo权限问题
如果Cron以普通用户运行,需配置sudo免密:在目标主机/etc/sudoers.d/下创建文件(如99-apt-upgrade),内容如下(替换your_user为实际运行Cron的用户):
your_user ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/local/bin/docker-compose
若Cron以root用户运行,直接删除脚本中的sudo即可。
3. 验证任务有效性
手动模拟Cron环境运行脚本测试:
PATH=/usr/local/bin:/usr/bin:/bin bash /opt/apt_upgrades/update.sh
查看/opt/apt_upgrades/log/upgrade.txt确认所有步骤执行正常。
内容的提问来源于stack exchange,提问作者evergreen-dev
相关产品推荐
相关产品推荐

