编写 Init 脚本
![]() 在此通知移除之前,请勿遵循此处的说明。 |
简介
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_args
、command_user
等(请参阅 openrc-run(8));不要创建不必要的配置变量,例如FOO_OPTS
、FOO_USER
等。如果您想在 init.d 脚本中预定义默认值,请使用通用用法: ${command_user=foo}
。
- 对于额外的配置变量,请使用 snake_case 命名(与 OpenRC 变量和 Alpine 中的其他 init 脚本保持一致)。不要以服务名称作为前缀,尽量与现有的 init 脚本保持一致(例如,
cfgfile
、cfgdir
、logfile
、cachedir
、listen_on
、start_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、日志记录
待办事项...