为什么我的shell脚本中docker-compose exec行作为cron任务运行失败?
问题排查与解决方法
1. 修复脚本Shebang配置
你当前脚本首行是#!/bin/sh -i,其中-i参数代表启动交互式shell,而cron运行任务时属于非交互式环境,该参数会导致shell执行异常提前退出,跳过后续命令。
请将脚本首行修改为:
#!/bin/bash
2. 补全命令绝对路径/配置PATH变量
cron默认的PATH环境变量仅包含系统基础路径,不会加载当前用户的自定义PATH配置,很可能无法找到docker-compose命令,这是这类问题最常见的诱因。
- 首先执行
which docker-compose查询命令的绝对路径,例如返回结果为/usr/local/bin/docker-compose - 要么直接在脚本中使用全路径调用命令:
/usr/local/bin/docker-compose exec -T webserver document_exporter ../export - 要么在脚本开头添加PATH配置,覆盖cron的默认值:
export PATH=/usr/local/bin:/usr/bin:/bin
如果是使用Docker Compose V2(不带横杠的docker compose命令),同理补全docker命令的绝对路径即可。
3. 增加错误日志定位问题
如果修改后仍然不生效,可以将命令的输出和错误日志重定向到文件,方便排查具体错误原因,将命令行修改为:
docker-compose exec -T webserver document_exporter ../export >> /home/user/paperless-backup.log 2>&1
运行后查看/home/user/paperless-backup.log文件内容,即可看到具体报错信息(比如权限不足、容器不存在、路径错误等)。
4. 可选优化项
为了避免目录切换失败导致命令执行异常,建议在cd命令后增加异常退出判断:
cd /home/user/paperless-ng || exit 1
内容的提问来源于stack exchange,提问作者ericarthurblair
相关产品推荐
相关产品推荐

