树莓派crontab执行bash文件传输脚本失败,寻求故障解决方法
树莓派crontab执行SCP传输脚本失败排查方案
核心问题
终端手动执行bash fileTX.sh可正常完成传输,但通过crontab配置@reboot /home/pi/fileTX.sh &执行时失效,已尝试添加可执行权限、使用完整路径、指定shell前缀等操作,问题仍未解决。
排查与解决办法
1. 环境变量缺失导致命令无法找到
crontab的默认PATH范围远小于终端,sshpass、scp这类命令可能不在crontab的搜索路径中,直接调用会执行失败。
- 先在终端执行
which sshpass和which scp,获取命令的绝对路径(例如/usr/bin/sshpass、/usr/bin/scp)。 - 将脚本中的
sshpass和scp替换为绝对路径,或者在脚本开头手动声明完整PATH:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
2. 系统启动时网络未就绪
@reboot的触发时机是系统刚启动,此时WiFi/以太网可能还未完成连接,导致ssh/scp无法访问目标IP。
- 解决办法:在脚本开头添加网络检测逻辑,等目标IP连通后再执行传输:
也可以直接添加固定延迟,比如# 等待目标IP可ping通,最多等待5分钟 count=0 until ping -c 1 $ip > /dev/null 2>&1; do sleep 5 count=$((count+1)) if [ $count -ge 60 ]; then echo "$(date): 网络连接超时" >> /home/pi/fileTX.log exit 1 fi donesleep 60(根据自身网络启动速度调整时长)。
3. SSH主机密钥未完成信任验证
如果是首次连接目标树莓派,终端会弹出确认主机密钥的交互提示,但crontab是无交互环境,会直接卡住进程。
- 先手动在终端执行一次
scp /home/pi/csv1.csv $username@$ip:/home/pi/Desktop,按提示输入yes确认密钥,后续crontab执行时就不会再触发该提示。 - 或者在脚本中自动添加密钥:
注意:如果使用root的crontab,需把路径改为ssh-keyscan $ip >> /home/pi/.ssh/known_hosts 2>&1/root/.ssh/known_hosts,建议优先使用pi用户的crontab(执行crontab -e,不要加sudo)。
4. 查看日志定位具体错误
crontab的执行日志能直接暴露问题,不要盲目试错:
- 修改crontab配置,将脚本的输出和错误重定向到日志文件:
@reboot /home/pi/fileTX.sh >> /home/pi/fileTX.log 2>&1 & - 查看系统crontab日志:执行
grep CRON /var/log/syslog,里面会记录脚本执行的状态和错误信息。
修改后的示例脚本
#!/bin/bash # 手动设置环境变量,避免crontab路径缺失 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin password="mypassword" username="myusername" ip="111.11.11.11" LOG_FILE="/home/pi/fileTX.log" # 等待网络连通 echo "$(date): 等待网络连接..." >> $LOG_FILE count=0 until ping -c 1 $ip > /dev/null 2>&1; do sleep 5 count=$((count+1)) if [ $count -ge 60 ]; then echo "$(date): 网络连接超时,退出脚本" >> $LOG_FILE exit 1 fi done # 添加目标主机密钥到known_hosts ssh-keyscan $ip >> /home/pi/.ssh/known_hosts 2>&1 # 用绝对路径执行命令(也可依赖上面设置的PATH) SSHPASS=$(which sshpass) SCP=$(which scp) echo "$(date): 开始循环传输文件..." >> $LOG_FILE while : do $SSHPASS -p "$password" $SCP /home/pi/csv1.csv $username@$ip:/home/pi/Desktop $SSHPASS -p "$password" $SCP /home/pi/csv2.csv $username@$ip:/home/pi/Desktop echo "$(date): Files Transmitted!!" >> $LOG_FILE sleep 30 done
crontab配置建议
使用pi用户执行crontab -e,添加以下内容:
@reboot /home/pi/fileTX.sh >> /home/pi/fileTX.log 2>&1 &
内容的提问来源于stack exchange,提问作者Liberty
相关产品推荐
相关产品推荐

