Menu Close

16.12. 查找该服务使用的文件

初始化脚本需要从专用目录中载入功能库,并允许导入配置、环境和 PID 文件。环境变量是在初始化脚本标头中以 #config 开始的行指定的,它转换为 EnvironmentFile 单元文件选项。在 #pidfile init 脚本行中指定的 PID 文件使用 PIDFile 选项导入到单元文件中。

未包含在初始化脚本标头中的关键信息是该服务可执行文件的路径,以及该服务可能需要的一些其他文件。在以前的 Red Hat Enterprise Linux 版本中,init 脚本使用 Bash case 语句定义默认操作的服务行为,如 start, stop, 或 restart,以及自定义的操作。以下来自 postfix init 脚本的摘录显示了在服务启动时要执行的代码块。

conf_check() {
    [ -x /usr/sbin/postfix ] || exit 5
    [ -d /etc/postfix ] || exit 6
    [ -d /var/spool/postfix ] || exit 5
}

make_aliasesdb() {
	if [ "$(/usr/sbin/postconf -h alias_database)" == "hash:/etc/aliases" ]
	then
		# /etc/aliases.db might be used by other MTA, make sure nothing
		# has touched it since our last newaliases call
		[ /etc/aliases -nt /etc/aliases.db ] ||
			[ "$ALIASESDB_STAMP" -nt /etc/aliases.db ] ||
			[ "$ALIASESDB_STAMP" -ot /etc/aliases.db ] || return
		/usr/bin/newaliases
		touch -r /etc/aliases.db "$ALIASESDB_STAMP"
	else
		/usr/bin/newaliases
	fi
}

start() {
	[ "$EUID" != "0" ] && exit 4
	# Check that networking is up.
	[ ${NETWORKING} = "no" ] && exit 1
	conf_check
	# Start daemons.
	echo -n $"Starting postfix: "
	make_aliasesdb >/dev/null 2>&1
	[ -x $CHROOT_UPDATE ] && $CHROOT_UPDATE
	/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
	RETVAL=$?
	[ $RETVAL -eq 0 ] && touch $lockfile
        echo
	return $RETVAL
}

init 脚本的可扩展性允许指定从 start() 功能块中调用的两个自定义功能 conf_check()make_aliasesdb()。然后,上面的代码中提到几个外部文件和目录:主服务可执行文件 /usr/sbin/postfix/etc/postfix//var/spool/postfix/ 配置目录,以及 /usr/sbin/postconf/ 目录。

systemd 只支持预定义的操作,但启用执行带有 ExecStart, ExecStartPre, ExecStartPost, ExecStop, 和 ExecReload 选项的自定义可执行文件。在 service start 中执行 /usr/sbin/postfix 以及支持脚本。转换复杂的初始化脚本需要了解脚本中的每个语句的用途。一些语句特定于操作系统版本,因此您不需要转换它们。另一方面,新环境中可能需要进行一些调整,无论是单元文件以及服务可执行文件和支持文件。