Migrieren Sie das socat init-Skript nach systemd

8

Ich benutze socat mit folgendem Init-Skript auf Debian 7.2 mit sysVinit. Es funktioniert perfekt:

#!/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

Nach einem Upgrade auf Debian 7.4 wurde das System jedoch auf systemd geändert. Um dasselbe Skript auf systemd auszuführen, habe ich einen Dienst hinzugefügt, der das Skript /etc/init.d/socat umschließt:

[Unit]
Description=Socat

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

[Install]
WantedBy=multi-user.target

Wenn ich den Dienst starte, wird er gestartet, aber direkt gestoppt:

Geladen: geladen (/usr/lib/systemd/system/socat.service; aktiviert)
Aktiv: inaktiv (tot) seit Fr, 18 Apr 2014 14:09:46 +0200; Vor 4s Prozess: 5334 ExecStart = / etc / init.d / socat start (Code = beendet, Status = 0 / SUCCESS) CGroup: name = systemd: /system/socat.service

Vermisse ich etwas

In OWL verloren
quelle
Vermisse ich etwas Ja, Sie haben es versäumt, das Skript init.d tatsächlich auf systemd zu migrieren :)
Piotr Dobrogost

Antworten:

8

Ich habe gerade herausgefunden, dass ich verwenden muss

Type=forking

wie unter http://www.freedesktop.org/software/systemd/man/systemd.service.html beschrieben .

Wenn diese Option auf Forking gesetzt ist, wird erwartet, dass der mit ExecStart = konfigurierte Prozess im Rahmen seines Startvorgangs fork () aufruft. Es wird erwartet, dass der übergeordnete Prozess beendet wird, wenn der Start abgeschlossen ist und alle Kommunikationskanäle eingerichtet sind. Das untergeordnete Element wird weiterhin als Hauptdämonprozess ausgeführt. Dies ist das Verhalten traditioneller UNIX-Daemons. Wenn diese Einstellung verwendet wird, wird empfohlen, auch die Option PIDFile = zu verwenden, damit systemd den Hauptprozess des Dämons identifizieren kann. systemd fährt mit dem Starten der Folgeeinheiten fort, sobald der übergeordnete Prozess beendet wird.

In OWL verloren
quelle
1

Für socat verwende ich einen reinen systemd Ansatz. Dies ist ein Beispiel für einen seriellen Loopback:

[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

Dies kann geschrieben werden /etc/systemd/system/socat-serial-lo.service(in Ubuntu 16.04+) und dann:

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

Ein Vorteil dieser Methode besteht darin, dass die durch definierte ExecStartBefehlszeile ohne Änderungen direkt über die Befehlszeile getestet werden kann, um den Befehl zu testen.

jjmontes
quelle