You need to enable JavaScript to run this app. Bash脚本手动执行正常但crontab运行时无法完成JSON文件FTP上传
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 21:06:04