alpine通过OpenRC服务设置开机自启,类似debian上的systemd

💡 若服务的状态管理不一致有关,也可能是 服务名 的 OpenRC 状态未正确重置导致的。可以尝试以下步骤:

rm -f /run/openrc/started/服务名

rm -f /run/openrc/started/服务名

在 Alpine Linux 上,使用 OpenRC 作为初始化系统,而不是 systemd。因此,配置开机自启动服务的方式与 systemd 不同。以下是如何在 Alpine Linux 上配置 Syncthing 开机自启动的步骤:

1. 创建启动脚本

首先,创建一个启动脚本 /etc/init.d/syncthing

#!/sbin/openrc-run

name="Syncthing"
description="Syncthing is a continuous file synchronization program."
command="/home/runapp/syncthing-linux-amd64-v1.26.1/syncthing"
command_args="-no-browser -no-restart -logflags=1 --logfile=/var/log/syncthing.log -log-max-size=52428800 --log-max-old-files=2"
pidfile="/run/syncthing.pid"
command_background="yes"

depend() {
    need net
}

start() {
    ebegin "Starting Syncthing"
    start-stop-daemon --start --background --make-pidfile --pidfile "$pidfile" --exec "$command" -- $command_args
    eend $?
}

stop() {
    ebegin "Stopping Syncthing"
    start-stop-daemon --stop --pidfile "$pidfile"
    eend $?
}

restart() {
    stop
    start
}

# 配置自动重启
respawn() {
    ebegin "Respawning Syncthing"
    start-stop-daemon --start --background --make-pidfile --pidfile "$pidfile" --exec "$command" -- $command_args
    eend $?
}

# 检查服务状态并自动重启
check() {
    if ! kill -0 $(cat "$pidfile") 2>/dev/null; then
        ewarn "Syncthing crashed, respawning..."
        respawn
    fi
}

# 定期检查服务状态
depend() {
    need net
    after localmount
    provide syncthing
}

# 每分钟检查一次服务状态
run_check() {
    while true; do
        sleep 60
        check
    done
}

start() {
    ebegin "Starting Syncthing"
    start-stop-daemon --start --background --make-pidfile --pidfile "$pidfile" --exec "$command" -- $command_args
    eend $?
    run_check &
}

💡 1. name: 服务的名称。

  1. description: 服务的描述。

  2. command: 服务的可执行文件路径。

  3. command_args: 服务的启动参数。

  4. pidfile: 服务的 PID 文件路径。

  5. command_background: 是否在后台运行服务。

1. **`name`**: 服务的名称。
2. **`description`**: 服务的描述。
3. **`command`**: 服务的可执行文件路径。
4. **`command_args`**: 服务的启动参数。
5. **`pidfile`**: 服务的 PID 文件路径。
6. **`command_background`**: 是否在后台运行服务。

2. 设置脚本权限

确保脚本具有可执行权限:

sudo chmod +x /etc/init.d/syncthing

3. 启用服务

启用服务以使其在开机时自动启动:

sudo rc-update add syncthing default

4. 启动服务

立即启动服务:

sudo rc-service syncthing start

5. 服务日志查看

service 服务名 status
tail -f /var/log/messages

Alpine Linux 开机自启脚本原理

在 Alpine Linux 中,OpenRC 是默认的初始化系统。OpenRC 使用 /etc/init.d/ 目录中的脚本来管理服务。每个服务都有一个对应的脚本,脚本中定义了服务的启动、停止、重启等操作。

关键点:

  1. 脚本路径: 服务脚本位于 /etc/init.d/ 目录下。
  2. 脚本格式: 脚本通常使用 #!/sbin/openrc-run 作为 shebang,并定义服务的启动、停止、依赖等操作。
  3. 依赖管理depend() 函数用于定义服务的依赖关系,例如网络依赖。
  4. 启动和停止start() 和 stop() 函数分别定义服务的启动和停止操作。
  5. 启用服务: 使用 rc-update add <service> default 命令将服务添加到默认运行级别,使其在开机时自动启动。

对比 systemd

systemd 的特点:

  1. 单元文件systemd 使用单元文件(.service.socket 等)来定义服务。
  2. 并行启动systemd 支持并行启动服务,加快系统启动速度。
  3. 依赖管理systemd 使用 WantsRequiresAfterBefore 等指令来管理服务依赖。
  4. 日志管理systemd 集成了 journald 日志系统,提供统一的日志管理。
  5. 服务状态systemctl 命令用于管理服务状态(启动、停止、重启、查看状态等)。

OpenRC 的特点:

  1. 简单轻量OpenRC 设计简单,占用资源少,适合嵌入式系统和轻量级系统。
  2. 脚本驱动: 服务管理基于脚本,易于理解和修改。
  3. 依赖管理: 使用 depend() 函数定义服务依赖。
  4. 日志管理: 使用传统的日志文件,如 /var/log/ 目录下的文件。
  5. 服务状态rc-service 命令用于管理服务状态。

示例

假设你要配置一个名为 `myapp` 的服务,其可执行文件路径为 `/usr/local/bin/myapp`,启动参数为 `--config=/etc/myapp/config.json`,PID 文件路径为 `/run/myapp.pid`,你可以创建一个 `/etc/init.d/myapp` 脚本:


```shell
#!/sbin/openrc-run

name="MyApp"
description="My custom application"
command="/usr/local/bin/myapp"
command_args="--config=/etc/myapp/config.json"
pidfile="/run/myapp.pid"
command_background="yes"

depend() {
    need net
}

start() {
    ebegin "Starting MyApp"
    start-stop-daemon --start --background --make-pidfile --pidfile "$pidfile" --exec "$command" -- $command_args
    eend $?
    run_check &
}

stop() {
    ebegin "Stopping MyApp"
    start-stop-daemon --stop --pidfile "$pidfile"
    eend $?
}

restart() {
    stop
    start
}

# 配置自动重启
respawn() {
    ebegin "Respawning MyApp"
    start-stop-daemon --start --background --make-pidfile --pidfile "$pidfile" --exec "$command" -- $command_args
    eend $?
}

# 检查服务状态并自动重启
check() {
    if ! kill -0 $(cat "$pidfile") 2>/dev/null; then
        ewarn "MyApp crashed, respawning..."
        respawn
    fi
}

# 定期检查服务状态
run_check() {
    while true; do
        sleep 60
        check
    done
}
```


### 步骤

1. **创建脚本**: 将上述内容保存为 `/etc/init.d/myapp`。
2. **设置权限**: 确保脚本具有可执行权限:

    ```shell
    sudo chmod +x /etc/init.d/myapp
    ```

3. **启用服务**: 将服务添加到默认运行级别,使其在开机时自动启动:

    ```shell
    sudo rc-update add myapp default
    ```

4. **启动服务**: 立即启动服务:

    ```shell
    sudo rc-service myapp start
    ```

自动化脚本

#!/bin/sh

# 提示用户输入 name
read -p "请输入服务的名称 (例如: Syncthing): " name

# 提示用户输入 description
read -p "请输入服务的描述 (例如: Syncthing is a continuous file synchronization program.): " description

# 提示用户输入 command
while true; do
    read -p "请输入服务的可执行文件路径 (例如: /home/runapp/syncthing-linux-amd64-v1.26.1/syncthing): " command
    if [ -f "$command" ]; then
        break
    else
        echo "错误: 文件 $command 不存在,请重新输入。"
    fi
done

# 提示用户输入 command_args(可选)
read -p "请输入服务的启动参数 (可选): " command_args

# 设置默认的 pidfile 和 command_background
pidfile="/run/$name.pid"
command_background="yes"

# 生成启动脚本
cat <<EOF | sudo tee /etc/init.d/$name > /dev/null
#!/sbin/openrc-run

name="$name"
description="$description"
command="$command"
command_args="$command_args"
pidfile="$pidfile"
command_background="$command_background"

depend() {
    need net
}

start() {
    ebegin "Starting $name"
    start-stop-daemon --start --background --make-pidfile --pidfile "\$pidfile" --exec "\$command" -- \$command_args
    eend \$?
    run_check &
}

stop() {
    ebegin "Stopping $name"
    start-stop-daemon --stop --pidfile "\$pidfile"
    eend \$?
}

restart() {
    stop
    start
}

# 配置自动重启
respawn() {
    ebegin "Respawning $name"
    start-stop-daemon --start --background --make-pidfile --pidfile "\$pidfile" --exec "\$command" -- \$command_args
    eend \$?
}

# 检查服务状态并自动重启
check() {
    if ! kill -0 \$(cat "\$pidfile") 2>/dev/null; then
        ewarn "$name crashed, respawning..."
        respawn
    fi
}

# 定期检查服务状态
run_check() {
    while true; do
        sleep 60
        check
    done
}
EOF

# 设置脚本权限
sudo chmod +x /etc/init.d/$name

# 启用服务
sudo rc-update add $name default

# 立即启动服务
sudo rc-service $name start

echo "服务 $name 已配置并启动。"

总结

  • systemd: 功能强大,适合复杂的系统管理,但占用资源较多。
  • OpenRC: 简单轻量,适合资源受限的系统,易于理解和修改。

欢迎指出任何有错误或不够清晰的表达,可以在下面评论区评论。

×

喜欢就点赞,疼爱就打赏

//