Raspbian系统将简易HTTPServer注册为系统服务后开机无法启动咨询
核心故障原因
- 路径不匹配:你最初标注的start.sh路径为
/home/pi/start.sh,但init.d脚本中调用的路径为/home/pi/poolMonitor/start.sh,路径不一致会导致启动时找不到脚本 - 运行级别配置错误:你配置的默认启动运行级别为5(图形界面模式),但树莓派等嵌入式设备默认运行级别多为3(多用户无图形模式),服务不会在默认级别触发启动
- 进程未正确脱离终端:仅加
&只能把进程放到后台执行,未处理SIGHUP信号,init流程结束时会直接杀掉后台进程,导致服务启动失败
修复步骤
1. 统一路径配置
首先确认所有脚本的实际存放目录,假设所有业务脚本(start.sh、stop.sh、poolMonitor.py)都存放在/home/pi/poolMonitor/目录下,后续所有配置统一使用该路径。
2. 改造start.sh实现正确 daemon 化
修改/home/pi/poolMonitor/start.sh内容如下:
#!/bin/bash cd "$(dirname "$0")" # 用nohup屏蔽终端挂起信号,输出重定向到日志,后台运行 nohup /usr/bin/python3 poolMonitor.py > /var/log/poolMonitor.log 2>&1 & # 记录进程PID方便管理 echo $! > /var/run/poolMonitor.pid
3. 修正init.d服务配置
修改/etc/init.d/poolMonitor内容如下:
#!/bin/bash ### BEGIN INIT INFO # Provides: Pool Monitor # Required-Start: $all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: Starts the Pool Monitor service ### END INIT INFO PID_FILE="/var/run/poolMonitor.pid" start() { if [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE) 2>/dev/null; then echo "Service is already running" return 0 fi echo -n "Starting Pool Monitor: " /home/pi/poolMonitor/start.sh echo "done" return 0 } stop() { if [ ! -f $PID_FILE ]; then echo "Service is not running" return 0 fi echo -n "Shutting down Pool Monitor: " kill $(cat $PID_FILE) rm -f $PID_FILE echo "done" return 0 } status() { if [ -f $PID_FILE ] && kill -0 $(cat $PID_FILE) 2>/dev/null; then echo "Pool Monitor is running, PID: $(cat $PID_FILE)" return 0 else echo "Pool Monitor is stopped" return 1 } } case "$1" in start) start ;; stop) stop ;; status) status ;; restart) stop start ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 1 ;; esac exit $?
你可以保留原有stop.sh的逻辑,也可以直接用上面的PID方式停止服务,二选一即可。
4. 配置执行权限
sudo chmod +x /home/pi/poolMonitor/*.sh sudo chmod +x /etc/init.d/poolMonitor
5. 重新注册服务
# 清除旧的服务注册规则 sudo update-rc.d -f poolMonitor remove # 注册新的服务规则 sudo update-rc.d poolMonitor defaults
6. 验证效果
先手动执行启停验证功能正常:
sudo service poolMonitor start sudo service poolMonitor status sudo service poolMonitor stop
验证正常后重启系统,检查服务是否自动启动,如果启动失败可以查看日志排查问题:
# 查看业务日志 cat /var/log/poolMonitor.log # 查看系统服务日志 journalctl -u poolMonitor
可选优化:使用Systemd服务单元(更稳定)
如果你的系统使用Systemd(当前绝大多数Linux发行版包括树莓派官方系统都默认使用),可以直接用Systemd服务配置替代init.d,可靠性更高:
- 创建服务配置文件
/etc/systemd/system/poolMonitor.service:
[Unit] Description=Pool Monitor Service After=network.target [Service] Type=forking User=root WorkingDirectory=/home/pi/poolMonitor ExecStart=/home/pi/poolMonitor/start.sh PIDFile=/var/run/poolMonitor.pid Restart=always [Install] WantedBy=multi-user.target
- 执行命令启用服务:
sudo systemctl daemon-reload sudo systemctl enable poolMonitor.service
内容的提问来源于stack exchange,提问作者jordanthompson
相关产品推荐
相关产品推荐

