Migre el script de inicio de socat a systemd

8

Uso socat con el siguiente script de inicio en debian 7.2 con sysVinit. Funciona perfectamente:

#!/bin/bash
DESC=socat
DAEMON=/usr/bin/socat
LIB=/usr/lib/socat
SOCAT_ARGS="-d -d -lf /var/log/socat.log"

[ ! -f /etc/default/socat.conf ] || . /etc/default/socat.conf

. /lib/lsb/init-functions

PATH=/bin:/usr/bin:/sbin:/usr/sbin

[ -x $DAEMON ] || exit 0

#
#       Try to increase the # of filedescriptors we can open.
#
maxfds () {
        [ -n "$SOCAT_MAXFD" ] || return
        [ -f /proc/sys/fs/file-max ] || return 0
        [ $SOCAT_MAXFD -le 4096 ] || SQUID_MAXFD=4096
        global_file_max=`cat /proc/sys/fs/file-max`
        minimal_file_max=$(($SOCAT_MAXFD + 4096))
        if [ "$global_file_max" -lt $minimal_file_max ]
        then
                echo $minimal_file_max > /proc/sys/fs/file-max
        fi
        ulimit -n $SOCAT_MAXFD
}

start_socat() {
        start-stop-daemon --quiet --start \
                --pidfile /var/run/socat.$NAME.pid \
                --background --make-pidfile \
                --exec $DAEMON -- $SOCAT_ARGS $ARGS < /dev/null
}

stop_socat() {
        start-stop-daemon --stop --quiet --pidfile /var/run/socat.$NAME.pid --exec $DAEMON
        rm -f /var/run/socat.$NAME.pid
}

start () {
        echo "Starting $DESC:"

        maxfds
        umask 027
        cd /tmp
        if test "x$AUTOSTART" = "xnone" -o -z "x$AUTOSTART" ; then
                echo "Autostart disabled."
                exit 0
        fi
        for NAME in $AUTOSTART ; do
                ARGS=`eval echo \\\$SOCAT_$NAME`
                echo $ARGS
                start_socat
                echo " $NAME $ARGS"
        done
        return $?
}

stop () {
        echo -n "Stopping $DESC:"

        for PIDFILE in `ls /var/run/socat.*.pid 2> /dev/null`; do
                NAME=`echo $PIDFILE | cut -c16-`
                NAME=${NAME%%.pid}
                stop_socat
                echo -n " $NAME"
        done
}

case "$1" in
    start)
        log_daemon_msg "Starting socat" "socat"
        if start ; then
                log_end_msg $?
        else
                log_end_msg $?
        fi
        ;;
    stop)
        log_daemon_msg "Stopping socat" "socat"
        if stop ; then
                log_end_msg $?
        else
                log_end_msg $?
        fi
        ;;
    reload|force-reload|restart)
        log_daemon_msg "Restarting socat" "socat"
        stop
        if start ; then
                log_end_msg $?
        else
                log_end_msg $?
        fi
        ;;
        *)
        echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart}"
        exit 3
        ;;
esac

exit 0

Sin embargo, después de una actualización a Debian 7.4, el sistema cambió a systemd. Entonces, para ejecutar el mismo script en systemd, agregué un servicio que envuelve el script /etc/init.d/socat:

[Unit]
Description=Socat

[Service]
ExecStart=/etc/init.d/socat start
ExecStop=/etc/init.d/socat stop

[Install]
WantedBy=multi-user.target

Cuando inicio el servicio, se inicia pero se detiene directamente:

Cargado: cargado (/usr/lib/systemd/system/socat.service; activado)
Activo: inactivo (muerto) desde el viernes 18 de abril de 2014 14:09:46 +0200; Hace 4s Proceso: 5334 ExecStart = / etc / init.d / socat start (código = salido, estado = 0 / ÉXITO) CGroup: name = systemd: /system/socat.service

¿Me estoy perdiendo de algo?

Perdido en OWL
fuente
¿Me estoy perdiendo de algo? Sí, se perdió la migración de la secuencia de comandos init.d a systemd :)
Piotr Dobrogost

Respuestas:

8

Acabo de descubrir que tengo que usar

Type=forking

como se describe en http://www.freedesktop.org/software/systemd/man/systemd.service.html .

Si se establece en bifurcación, se espera que el proceso configurado con ExecStart = llame a fork () como parte de su inicio. Se espera que el proceso principal salga cuando se complete el inicio y se configuren todos los canales de comunicación. El niño continúa ejecutándose como el proceso principal del demonio. Este es el comportamiento de los demonios tradicionales de UNIX. Si se usa esta configuración, se recomienda usar también la opción PIDFile =, para que systemd pueda identificar el proceso principal del demonio. systemd procederá con el inicio de las unidades de seguimiento tan pronto como finalice el proceso principal.

Perdido en OWL
fuente
1

Para socat , uso un enfoque systemd puro . Este es un ejemplo para un loopback serial:

[Unit]
Description=Socat Serial Loopback
#Before=my-other.service

[Service]
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=socat-serial-lo

ExecStart=/usr/bin/socat -d -d pty,raw,echo=0,link=/tmp/seriallo-a pty,raw,echo=0,link=/tmp/seriallo-b
Restart=always

[Install]
WantedBy=multi-user.target

Esto se puede escribir en /etc/systemd/system/socat-serial-lo.service(en Ubuntu 16.04+), y luego:

systemctl daemon-reload
systemctl start socat-serial-lo
systemctl enable socat-serial-lo  # (to start it during bootup)

Una ventaja de este método es que la línea de comando definida por ExecStartse puede probar directamente desde la línea de comando sin alteraciones, para probar el comando.

jjmontes
fuente