默认情况下,Debian 9 中的 systemd 是默认值。但我仍然在/etc/init.d目录下看到很多东西。这是否意味着我仍然可以将东西放在那里来启动?将首先执行哪个目录(systemd 或 init.d)?
答案1
当systemd
启动或systemctl daemon-reload
运行时,systemd
运行一个systemd-sysv-generator
程序,该程序将创建一个脚本列表/etc/init.d
并为它们生成相应的单元,除非它们已经存在.service
systemd-native单元。.service
生成器将解释脚本中的任何 LSB 标头块init.d
。它们看起来像这样:
### BEGIN INIT INFO
# Provides: apache2
# Required-Start: $local_fs $remote_fs $network $syslog $named
# Required-Stop: $local_fs $remote_fs $network $syslog $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: Apache2 web server
# Description: Start the web server
# This script will start the apache2 web server.
### END INIT INFO
任何描述的依赖项(此处$local_fs $remote_fs $network $syslog $named
)都将被转换为相应的 systemd 依赖项。由于脚本和 systemd 服务之间并不总是存在简单的一对一映射,因此生成器会专门将init.d
一些 LSB 依赖项(如$remote_fs
、$network
、$named
和$portmap
)$time
映射到相应的 systemd单元。.target
自动生成的包装服务将简单地运行相应的init.d
脚本。basic.target
只要它们的依赖项允许,所有包装器脚本都会被命令在 systemd 之后运行。这使得 LSB 标头变得相当重要:如果您依赖于生成器机制并且您的依赖项列表不完整,则很可能在它所依赖的内容准备就绪之前过早地systemd
尝试运行您的脚本。init.d
某些打包服务也可能只有一个init.d
脚本,但有两个或多个 systemd 服务文件(例如 NFS 服务)。在这种情况下,软件包将不依赖于生成器,而是同时提供脚本init.d
和服务文件(名称不重叠)。软件包还将在 处提供一个/lib/systemd/system/<name of init script>.service
指向的符号链接/dev/null
。这使得systemd
从 init 脚本自动生成的服务被视为永久屏蔽,而本机单元文件将代替处理服务进程。