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

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,可靠性更高:

  1. 创建服务配置文件/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
  1. 执行命令启用服务:
sudo systemctl daemon-reload
sudo systemctl enable poolMonitor.service

内容的提问来源于stack exchange,提问作者jordanthompson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:54:02