Red Hat Training

A Red Hat training course is available for RHEL 8

3.5.4.4. Búsqueda de archivos utilizados por el servicio

Los scripts de inicio requieren la carga de una biblioteca de funciones desde un directorio dedicado y permiten importar archivos de configuración, entorno y PID. Las variables de entorno se especifican en la línea que comienza con #config en la cabecera del script de init, que se traduce en la opción de archivo de unidad EnvironmentFile. El archivo PID especificado en la línea del script de inicio #pidfile se importa al archivo de unidad con la opción PIDFile.

La información clave que no se incluye en la cabecera del script de init es la ruta al ejecutable del servicio, y potencialmente algunos otros archivos requeridos por el servicio. En versiones anteriores de Red Hat Enterprise Linux, los scripts de init utilizaban una sentencia case de Bash para definir el comportamiento del servicio en acciones predeterminadas, tales como start, stop, o restart, así como acciones definidas por el usuario. El siguiente extracto del script de init postfix muestra el bloque de código que se ejecuta al iniciar el servicio.

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
}

La extensibilidad del script init permitió especificar dos funciones personalizadas, conf_check() y make_aliasesdb(), que se llaman desde el bloque de funciones start(). En el código anterior se mencionan varios archivos y directorios externos: el ejecutable del servicio principal /usr/sbin/postfix, los directorios de configuración /etc/postfix/ y /var/spool/postfix/, así como el directorio /usr/sbin/postconf/.

Systemd sólo admite las acciones predefinidas, pero permite ejecutar ejecutables personalizados con las opciones ExecStart, ExecStartPre, ExecStartPost, ExecStop y ExecReload. El /usr/sbin/postfix junto con los scripts de apoyo se ejecutan al iniciar el servicio. La conversión de scripts init complejos requiere entender el propósito de cada declaración en el script. Algunas de las sentencias son específicas de la versión del sistema operativo, por lo que no es necesario traducirlas. Por otro lado, pueden ser necesarios algunos ajustes en el nuevo entorno, tanto en el archivo de unidad como en el ejecutable del servicio y los archivos de apoyo.