1.12. 查找该服务使用的文件
初始化脚本需要从专用目录中载入功能库,并允许导入配置、环境和 PID 文件。环境变量在初始化脚本标头中以 #config 开头的行中指定,它转换为 EnvironmentFile
单元文件选项。#pidfile 初始化脚本行中指定的 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 }
初始化脚本的可扩展性允许指定两个自定义函数,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
以及支持脚本。转换复杂的初始化脚本需要了解脚本中每个语句的用途。其中一些语句特定于操作系统版本,因此您不需要转换它们。另一方面,在新环境中可能需要在单元文件、以及服务可执行文件和支持文件中进行一些调整,。