树莓派Bash脚本手动运行正常但作为Cronjob无法执行如何解决
排查与解决方向
- 修正crontab的PATH配置:PATH变量仅用于存放可执行命令的目录,不可写入单个脚本路径,将crontab开头的PATH配置修改为:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - 配置sudo免密权限:cron运行在非交互环境下,无法输入sudo密码,需要给pi用户配置脚本内用到的rsync、cp命令的免密权限。执行
sudo visudo,在文件末尾添加如下内容后保存退出:pi ALL=(ALL) NOPASSWD: /usr/bin/rsync, /usr/bin/cp - 脚本内统一使用绝对路径:cron的默认工作目录为执行用户的家目录,相对路径会导致文件读写异常,将脚本内的
davislog.log修改为绝对路径,修改后的脚本参考:#!/bin/bash dt=$(date '+%d-%m-%Y_%H-%M-%S'); sudo rsync -a -v /home/pi/davisbot/audio/ /mnt/resources/davisbot_audios/ --log-file=/home/pi/davislog.log sudo cp -rv /home/pi/davislog.log /mnt/resources/davisbot_audios/"$dt"davislog.log - 确认脚本执行权限:执行
chmod +x /home/pi/davisbackup.sh确保脚本具备可执行权限。 - 采集cron执行日志定位问题:将crontab任务修改为如下内容,把执行的输出和错误日志都写入本地文件,方便排查具体报错:
等待1分钟后查看* * * * * /home/pi/davisbackup.sh >> /home/pi/cron_backup_debug.log 2>&1/home/pi/cron_backup_debug.log的内容,即可看到任务执行的具体错误信息。也可执行grep CRON /var/log/syslog查看系统层面的cron运行日志。 - 验证SMB挂载可用性:确认
/mnt/resources的挂载对pi用户开放读写权限,且cron触发时挂载处于生效状态,可在脚本开头添加挂载检测逻辑,避免挂载未就绪导致备份失败:
若添加了mount命令,需要在之前的sudo免密配置中补充# 检测挂载点是否生效,未生效则先执行挂载 if ! mountpoint -q /mnt/resources; then sudo mount /mnt/resources fi/usr/bin/mount的权限。
内容的提问来源于stack exchange,提问作者CryptoJu
相关产品推荐
相关产品推荐

