crontab定时执行sbatch调用rclone复制任务无目标文件怎么办
问题根因
- 相对路径不兼容crontab运行环境:crontab执行任务时默认工作目录为当前用户的家目录,不会继承你手动执行命令时所在的
/myproject/path/路径。你脚本中写的./desiredtocopy/、mykey.conf均为相对路径,crontab触发任务时会在家目录下查找这些文件,自然找不到源目录和rclone配置,导致复制失败。手动执行命令时你处于项目路径下,隐式满足了路径查找条件,所以能正常运行。 - crontab环境变量缺失:crontab启动的进程仅加载极简的默认PATH配置,不会继承你交互式登录shell的环境变量,若
rclone、sbatch等命令的路径不在默认PATH中,会直接触发命令不存在的报错;同时未加载集群环境的情况下,slurm作业调度相关的调用也会异常。 - 脚本与定时规则配置错误:
- crontab中直接提交的
file1.txt不是规范的slurm作业脚本,无shebang头、无资源声明、无工作目录切换逻辑,仅在手动执行的特殊场景下能跑通;你预先写的MyCopy.sh脚本根本没有被定时任务调用。 - rclone命令中目标路径
/mydestination/:多了冗余冒号,冒号仅用于rclone远端存储别名后(例如myremote:/path/),本地路径加冒号会触发路径解析错误。 - 定时规则
* 5 * * *代表每日5点的每分钟都提交一次作业,并非每日5点执行一次,属于规则配置错误。
- crontab中直接提交的
- 日志收集不全:当前重定向规则仅收集了
sbatch命令本身的输出(即作业提交成功的提示),没有收集slurm作业实际运行时的标准输出、错误输出,看不到作业运行阶段的报错信息,无法定位失败原因。
修复步骤
- 修正rclone命令,全部使用绝对路径
编辑/myproject/path/file1.txt,替换所有相对路径为绝对路径,删除目标路径冗余冒号,内容如下:
执行# 注意替换rclone二进制路径为你环境中`which rclone`返回的实际路径 # 如果/mydestination是rclone配置的远端存储,正确写法为「存储别名:目标路径」,例如`myremote:/mydestination/` /usr/bin/rclone --config=/myproject/path/mykey.conf copy /myproject/path/desiredtocopy/ /mydestination/ -Pchmod +x /myproject/path/file1.txt给文件加可执行权限。 - 编写规范的slurm作业脚本
编辑/myproject/path/MyCopy.sh,补充slurm作业头、环境加载、工作目录切换逻辑,内容如下:
执行#!/bin/bash #SBATCH --job-name=rclone_dir_copy #SBATCH --output=/myproject/path/slurm_rclone_%j.log #SBATCH --error=/myproject/path/slurm_rclone_%j.err #SBATCH --cpus-per-task=2 #SBATCH --time=03:00:00 # 若集群通过module管理软件,放开下面的注释加载rclone # module load rclone # 强制切换到项目工作目录,切换失败直接退出 cd /myproject/path/ || exit 1 # 执行复制命令,单作业无需额外套srun调用 bash /myproject/path/file1.txtchmod +x /myproject/path/MyCopy.sh给脚本加可执行权限。 - 修正crontab定时规则
先执行which sbatch拿到sbatch的绝对路径(通常为/usr/bin/sbatch),再执行crontab -e编辑定时配置,替换原有规则为以下内容:# 给crontab补全基础命令搜索路径 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 每日凌晨5点整执行作业,注意开头的0代表整点,避免重复提交 0 5 * * * cd /myproject/path/ && /usr/bin/sbatch /myproject/path/MyCopy.sh >> /myproject/path/cron_submit.log 2>&1 - 结果验证
任务触发后,先查看cron_submit.log确认作业提交成功,再查看对应作业号生成的slurm_rclone_*.err日志确认无rclone报错,最后到目标路径校验复制结果即可。
内容的提问来源于stack exchange,提问作者adeshina Ibrahim
相关产品推荐
相关产品推荐

