You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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
    done
    
    也可以直接添加固定延迟,比如sleep 60(根据自身网络启动速度调整时长)。

3. SSH主机密钥未完成信任验证

如果是首次连接目标树莓派,终端会弹出确认主机密钥的交互提示,但crontab是无交互环境,会直接卡住进程。

  • 先手动在终端执行一次scp /home/pi/csv1.csv $username@$ip:/home/pi/Desktop,按提示输入yes确认密钥,后续crontab执行时就不会再触发该提示。
  • 或者在脚本中自动添加密钥:
    ssh-keyscan $ip >> /home/pi/.ssh/known_hosts 2>&1
    
    注意:如果使用root的crontab,需把路径改为/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:43:15