Bash脚本手动执行正常但crontab运行时无法完成JSON文件FTP上传
crontab下FTP脚本无法上传文件的解决方案
根因定位
日志显示FTP已成功连接远程服务器、切换到/www目录,但无文件上传,核心原因为相对路径匹配的工作目录在crontab环境下不符合预期:
- 手动执行脚本时,终端的当前工作目录通常是存放JSON文件的
/amadeus,mput *.json可正确匹配到本地待上传文件 - crontab执行任务时,默认工作目录为执行用户的家目录(
/home/thierry),而非/amadeus。此时mput *.json会在家目录下查找JSON文件,无匹配结果因此无文件上传,FTP连接、目录切换等步骤均正常,无错误输出(对应2.log为空、1.log仅保留pwd的返回结果)。 - 额外隐患:here-document未对通配符做处理,当前shell会提前对
*.json做路径展开,受shell全局配置(如nullglob、nocaseglob)影响可能出现匹配异常。
解决方案
1. 修改/amadeus/ftp.sh脚本
在启动FTP前强制切换到待上传文件的目录,避免依赖执行环境的默认工作目录,同时优化通配符处理:
#!/bin/bash . /home/thierry/.bash_profile # 新增:强制切换到JSON文件所在目录,切换失败直接退出 cd /amadeus || exit 1 # 常量配置 HOST=xxxx LOGIN=xxxxx PASSWORD=xxxxxx PORT=21 # 可选:加-v参数开启FTP详细日志,方便后续排查 ftp -iv -n $HOST $PORT << END_SCRIPT quote USER $LOGIN quote PASS $PASSWORD cd www pwd asc # 转义通配符,避免被当前shell提前展开,交由FTP客户端处理当前目录下的文件 mput \*.json quit END_SCRIPT
2. 验证执行效果
修改完成后,先模拟crontab的非当前目录环境手动执行脚本,确认能正常上传:
# 切换到其他目录执行,模拟crontab的工作目录场景 cd /tmp && . /amadeus/ftp.sh
如果上传成功,再等待crontab下一次自动执行,确认远程服务器收到文件即可。
3. 可选优化
如果.bash_profile内包含交互式shell专属配置(如仅在登录终端加载的逻辑、别名、提示符配置),可在脚本中单独加载需要的环境变量,避免非交互式shell(crontab运行时)加载异常。
内容的提问来源于stack exchange,提问作者Theo75
相关产品推荐
相关产品推荐

