远程运行树莓派Stretch系统bash脚本,重启后脚本中断如何续执行?
解决远程SSH脚本因树莓派重启中断的问题
嘿,作为第一年的学徒能想到用脚本自动化发布测试已经超棒了!针对你遇到的「树莓派重启直接终止远程脚本,无法继续后续流程」的问题,我有几个实用的方案,完全适配你从办公PC远程运行、传递参数的需求:
方案一:本地脚本等待树莓派恢复后,推送后续任务
这是最贴合你需求的方式——让本地启动脚本在树莓派重启后,主动检测其连通性,恢复后再推送第二阶段的测试逻辑。
具体实现步骤
- 拆分测试流程:把「创建flag文件+重启」放在第一阶段脚本
auto_test.sh,把重启后的验证逻辑放在post_reboot_test.sh。 - 修改本地启动脚本,在第一阶段执行完后,添加循环检测树莓派SSH连通性的逻辑,直到恢复后再执行第二阶段:
#!/bin/bash CONFIG=/home/user/Schreibtisch/config.sh source $CONFIG echo "Release AutoTest V0.7 on $DEVICE_ID" echo "Make sure an external WLAN chip is plugged in" read -p "Press ENTER to start" # 执行第一阶段:创建flag文件并重启树莓派 ssh root@$DEVICE_IP "bash -s" -- < /home/user/Schreibtisch/auto_test.sh "$PMD" "$BTDMD" "$AND TEN MORE PARAMETERS..." # 等待树莓派重启恢复(用SSH检测比ping更可靠,确保服务就绪) echo "等待树莓派重启完成..." until ssh -o ConnectTimeout=5 root@$DEVICE_IP exit; do echo "树莓派尚未恢复,5秒后重试..." sleep 5 done echo "树莓派已重启,开始执行后续测试..." # 推送第二阶段脚本并执行 ssh root@$DEVICE_IP "bash -s" -- < /home/user/Schreibtisch/post_reboot_test.sh "$OTHER_PARAMETERS" exit 0
关键细节
- 用
ssh -o ConnectTimeout=5 root@$DEVICE_IP exit检测:比单纯ping更准确,因为ping通不代表SSH服务已经启动完成。 - 确保你的办公PC和树莓派之间配置了SSH密钥登录,避免脚本执行过程中弹出密码输入框导致中断。
方案二:在树莓派上临时配置@reboot cron任务(适合需要自动触发重启后逻辑的场景)
如果希望树莓派重启后自动执行后续任务,同时保留从本地传递的参数,可以在第一阶段脚本中临时添加cron任务,配合临时参数文件实现:
具体实现步骤
- 在
auto_test.sh的末尾添加以下逻辑(创建flag、保存参数、配置cron、重启):
# 创建需要的标志文件 touch /path/to/flagfile1 touch /path/to/flagfile2 # 将传入的参数保存到临时文件(方便重启后读取) echo "$1 $2 $3 ..." > /tmp/test_params.txt # 临时添加@reboot cron任务,重启后执行后续脚本 # 注意:先备份原有cron任务,避免覆盖 (crontab -l 2>/dev/null; echo "@reboot bash /tmp/post_reboot_test.sh \$(cat /tmp/test_params.txt)") | crontab - # 重启树莓派 reboot
- 本地启动脚本中,先把
post_reboot_test.sh推送到树莓派的临时目录:
# 在执行auto_test.sh之前,先把后续脚本传到树莓派 scp /home/user/Schreibtisch/post_reboot_test.sh root@$DEVICE_IP:/tmp/ ssh root@$DEVICE_IP "chmod +x /tmp/post_reboot_test.sh" # 然后执行第一阶段脚本 ssh root@$DEVICE_IP "bash -s" -- < /home/user/Schreibtisch/auto_test.sh "$PMD" "$BTDMD" "$AND TEN MORE PARAMETERS..." # 可选:等待树莓派恢复后,清理临时文件和cron任务 until ssh -o ConnectTimeout=5 root@$DEVICE_IP exit; do sleep 5 done ssh root@$DEVICE_IP "crontab -l | grep -v '@reboot bash /tmp/post_reboot_test.sh' | crontab - && rm /tmp/test_params.txt /tmp/post_reboot_test.sh"
关键细节
- 一定要记得清理临时cron任务和参数文件,避免下次运行时触发重复任务。
- 如果
post_reboot_test.sh需要依赖配置文件,也可以通过scp提前传到树莓派。
额外小提示
- 测试时可以先手动模拟重启,验证检测逻辑是否正常工作。
- 可以在脚本中添加日志输出,比如把测试结果保存到本地文件,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Jojo




