树莓派Debian环境下Domoticz监控脚本控制台正常但Cron任务失效
解决Domoticz监控脚本在Cron/Sudo下的
[[: not found]]错误及Cron执行账户说明 先直接给你两个核心问题的答案,再讲具体修复步骤:
1. 为什么会出现[[: not found]]错误?
这个报错是Shell语法兼容性问题导致的:
- 你脚本里用的
[[ ... ]]是Bash独有的扩展条件判断语法,但Debian系默认的/bin/sh是Dash(轻量级POSIX Shell),它不支持[[这种非标准语法。 - 当通过Cron执行任务时,Cron默认使用
/bin/sh来运行脚本(哪怕你脚本开头写了#!/bin/bash,部分场景下Cron的环境会忽略Shebang或用默认Shell解析);而用sudo执行时,如果没有明确指定Shell,也可能因为sudo的环境变量问题,导致脚本没有按预期用Bash运行。
你直接用pi用户运行脚本正常,是因为pi的默认Shell是Bash,会严格按脚本的Shebang指定的解释器执行。
2. 你的Cron任务是以哪个账户执行的?
你配置的Cron任务*/5 * * * * pi /home/pi/...是写在**系统级crontab(/etc/crontab)**里的,这种格式会明确以pi用户身份执行。如果是用crontab -e编辑的用户级crontab,任务会自动以当前编辑的用户(也就是pi)执行,不需要在时间字段后写用户名。
修复方案(两种任选其一)
方案一:改用POSIX兼容的语法(推荐,更通用)
把脚本里的[[替换成POSIX标准的写法,比如用case语句(比grep更高效),避免依赖Bash扩展:
修改后的脚本示例:
#!/bin/bash echo 'Checking if Domoticz is running.' DomoticzState=$(service domoticz.sh status) # 后续会说明如何去掉sudo case "$DomoticzState" in *"active (running)"*) echo 'Domoticz is running. Nothing to do.' ;; *"domoticz is not running ... failed!"*|*"active (exited)"*|*"inactive (dead)"*) echo 'Domoticz is not running properly. Restarting Domoticz...' service domoticz.sh restart echo 'Domoticz restarted.' ;; esac
额外优化:去掉脚本里的sudo
每次执行都用sudo容易引发环境问题,建议给pi用户配置免密执行domoticz服务命令:
- 执行
sudo visudo打开sudoers配置文件 - 添加一行(可通过
which service查看实际路径):pi ALL=(ALL) NOPASSWD: /usr/sbin/service domoticz.sh status, /usr/sbin/service domoticz.sh restart - 保存退出后,脚本里就可以直接用
service domoticz.sh ...,不用加sudo了。
方案二:强制Cron和Sudo用Bash执行脚本
如果不想修改脚本语法,直接在Cron任务里明确指定用Bash运行:
*/5 * * * * pi /bin/bash /home/pi/domoticz/scripts/domoticz_state_checker.sh >> /home/pi/domoticz/scripts/domoticz_state_checker.log 2>&1
用sudo执行时,也明确指定Bash:
sudo /bin/bash /home/pi/domoticz/scripts/domoticz_state_checker.sh
这样就能确保脚本用Bash解析,支持[[语法了。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

