编写 Init 脚本

来自 Alpine Linux
此材料正在进行中...

在此通知移除之前,请勿遵循此处的说明。
(最后编辑人:Sertonix,于 2023 年 8 月 25 日。)

简介

Alpine Linux 使用 OpenRC init 系统来启动服务。不要将 OpenRC init 与我们的系统 init(即第一个执行的进程,也称为 pid 1)混淆。Alpine Linux 中发现的许多当前 init.d 脚本都取自 Gentoo。如果您想节省时间,可以搜索 Gentoo 的仓库,查找您的服务的现有 init 脚本。您还可以查看 Gentoo 的 wiki,以获取有关 OpenRC 的更多信息。

注意:OpenRC 最近添加了关于如何编写正确的 Init 脚本的 文档。请务必阅读!

如果您找不到 Gentoo 的 init.d 脚本,或者您只是想开始编写自己的 init.d 脚本,我们将为您提供一些关于如何编写简单的 OpenRC init 脚本的基本信息。

有关 OpenRC 格式的主要信息可以在 OpenRC 手册页 openrc-run 中找到。

apk add openrc-doc
man openrc-run

应避免的事项

  • 不要在 init.d 脚本中定义 supervisor=supervise-daemon!这样,用户在不修改 init.d 脚本的情况下无法禁用它。如果您真的想为特定服务预定义 supervise-daemon,请在相应的 conf.d 文件中定义它。
  • 首选标准的 OpenRC 变量,例如 command_argscommand_user 等(请参阅 openrc-run(8));不要创建不必要的配置变量,例如 FOO_OPTSFOO_USER 等。如果您想在 init.d 脚本中预定义默认值,请使用通用用法 : ${command_user=foo}
  • 对于额外的配置变量,请使用 snake_case 命名(与 OpenRC 变量和 Alpine 中的其他 init 脚本保持一致)。不要以服务名称作为前缀,尽量与现有的 init 脚本保持一致(例如,cfgfilecfgdirlogfilecachedirlisten_onstart_wait 等)。

最小模板

您编写的每个 init.d 脚本都需要以 shebang 开头,例如

#!/sbin/openrc-run

完全依赖 OpenRC 的服务

#!/sbin/openrc-run

command=/path/to/command

s6 监管的服务

注释

  • 安装并配置 s6-scan 服务以在系统启动时启动
  • 排除 start()stop()status() 函数,以便 s6 监管可靠地工作。OpenRC 具有内置的等效函数,可以调用必要的 s6 命令。
  • 包含 depend() 节,以确保 s6-svscan 服务已在运行。
  • 添加 start_pre() 节,将服务目录符号链接到扫描目录中,因为 /etc/init.d/bootmisc 脚本会在系统启动时清理 /run 目录。
#!/sbin/openrc-run

name="foo"
supervisor="s6"
s6_service_path="${RC_SVCDIR}/s6-scan/${name}"

depend() {
    need s6-svscan
}

start_pre() {
    if [ ! -L "${RC_SVC_DIR}/s6-scan/${name}" ]; then
        ln -s "/path/to/${name}/service/dir" "${RC_SVCDIR}/s6-scan/${name}"
    fi
}

以下基本示例的其余部分可以省略,但这很可能会导致您的 initd 脚本无法工作。

基本示例

#!/sbin/openrc-run
  
name=$RC_SVCNAME
cfgfile="/etc/$RC_SVCNAME/$RC_SVCNAME.conf"
command="/usr/bin/my_daemon"
command_args="--my-daemon-args"
command_user="my_system_user"
pidfile="/run/$RC_SVCNAME/$RC_SVCNAME.pid"
start_stop_daemon_args="--args-for-start-stop-daemon"
command_background="yes"

depend() {
        need net
}

start_pre() {
        checkpath --directory --owner $command_user:$command_user --mode 0775 \
                /run/$RC_SVCNAME /var/log/$RC_SVCNAME
}

start、stop、restart 函数

OpenRC 定义了一些基本函数,即:start、stop、restart。这些函数默认定义,但可以通过定义您自己的一组函数来覆盖。这通常仅在您想要执行默认 start/stop/restart 实现未提供的特殊操作时才需要。

start

start() {
    ebegin "Starting mydaemon"
    start-stop-daemon --start \
        --exec /usr/sbin/mydaemon \
        --pidfile /var/run/mydaemon.pid \
        -- \
        --args-for-mydaemon
    eend $?
}

stop

restart

守护进程、Forking、日志记录

待办事项...