手动可执行的Shell脚本无法通过Cron执行的排查求助
问题排查:Cron执行Shell脚本提示"not found"但手动运行正常
问题概述
某Shell脚本在用户账户下手动执行完全正常,但通过Cron定时任务运行时提示找不到脚本,日志输出:
/bin/sh: 1: /home/user/Scripts/HRsnapshot.sh: not found
相关配置详情
1. Crontab配置
#Download HR File from Google and push it to HR Server via SFTP 38 11 * * * BASH_ENV=/home/user/Scripts/preload.sh /home/user/Scripts/HRsnapshot.sh
2. 环境变量加载脚本preload.sh
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin . /etc/profile . ~/.bashrc export GAMCFGDIR="/home/user2/GAMConfig"
3. 用户Bash配置文件(含GAM设置)
#Setting for Gam Config export GAMCFGDIR="/home/user2/GAMConfig" export PATH alias gam="/home/user2/bin/gamadv-xtd3/gam"
4. 主脚本HRsnapshot.sh
#!/bin/bash cd /home/user/Scripts /home/user2/bin/gamadv-xtd3/gam user 'hellodolly@conso.org' get drivefile id '1S4tkzS2lIj360-WFhTy3FBm6kZ7hsL4PvO7PdikffiidI' format 'csv' targetfolder /home/user/SFTP/daily_export/ targetname 'FY2022_HR_Form.csv' overwrite sshpass -p '*jndn4Kz#8Rwrj' sftp GoogleSFTP@10.0.0.0<<EOF cd /D:/SFTPRoot/Google_Workflows put /home/user/SFTP/daily_export/FY2022_HR_Form.csv exit EOF
5. Cron日志
Oct 15 13:07:01 JUMPBOX CRON[5431]: (user) CMD (BASH_ENV=/home/user/Scripts/preload.sh /home/user/Scripts/HRsnapshot.sh)
排查步骤与解决方案
1. 检查脚本及目录权限
Cron运行时的用户权限可能受限,执行以下命令验证权限:
ls -ld /home/user /home/user/Scripts /home/user/Scripts/HRsnapshot.sh
确保:
/home/user权限至少为r-x(如755),允许Cron用户进入目录/home/user/Scripts权限为rwx(如755)HRsnapshot.sh拥有执行权限,若没有则执行:chmod +x /home/user/Scripts/HRsnapshot.sh
2. 检查脚本换行符格式
如果脚本是在Windows环境编辑后上传的,会带有CRLF换行符,导致/bin/sh解析错误。可以:
- 用
cat -v /home/user/Scripts/HRsnapshot.sh查看是否有^M字符(Windows换行符标记) - 若存在,用
dos2unix转换为Unix格式:dos2unix /home/user/Scripts/HRsnapshot.sh
3. 修正Cron执行方式与环境变量加载
Cron默认使用/bin/sh,即使脚本指定#!/bin/bash,环境变量传递仍可能存在问题。修改Crontab配置为直接用bash执行并记录日志:
38 11 * * * /bin/bash /home/user/Scripts/HRsnapshot.sh >> /home/user/Scripts/cron_hr_log.log 2>&1
同时将环境变量加载逻辑直接整合到HRsnapshot.sh开头(避免Cron下~路径指向错误):
#!/bin/bash # 加载必要环境变量 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin . /etc/profile . /home/user/.bashrc # 使用绝对路径加载用户bash配置 export GAMCFGDIR="/home/user2/GAMConfig" # 原脚本内容 cd /home/user/Scripts ...
4. 验证依赖命令的绝对路径
虽然脚本中GAM用了绝对路径,但sshpass可能在Cron的PATH中找不到,执行which sshpass获取其绝对路径,替换脚本中的sshpass为该路径,例如:
/usr/bin/sshpass -p '*jndn4Kz#8Rwrj' sftp GoogleSFTP@10.0.0.0<<EOF
5. 查看完整执行日志
通过Crontab中的日志重定向(步骤3中添加的>> /home/user/Scripts/cron_hr_log.log 2>&1),可以查看脚本执行的完整输出,进一步定位隐藏问题。
内容的提问来源于stack exchange,提问作者Mike Reilly
相关产品推荐
相关产品推荐

