Bermigrasi skrip init socat ke systemd


8

Saya menggunakan socat dengan mengikuti skrip init pada debian 7.2 dengan sysVinit. Ini bekerja dengan sempurna:

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

Namun setelah upgrade ke debian 7.4 sistem berubah menjadi systemd. Jadi untuk menjalankan skrip yang sama pada systemd saya menambahkan layanan yang membungkus skrip /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

Ketika saya memulai layanan itu dimulai tetapi berhenti secara langsung:

Dimuat: dimuat (/usr/lib/systemd/system/socat.service; diaktifkan)
Aktif: tidak aktif (mati) sejak Jumat, 18 Apr 2014 14:09:46 +0200; 4d lalu Proses: 5334 ExecStart = / etc / init.d / socat mulai (kode = keluar, status = 0 / SUKSES) CGroup: name = systemd: /system/socat.service

Apakah saya melewatkan sesuatu?


Apakah saya melewatkan sesuatu? Ya, Anda melewatkan migrasi skrip init.d ke systemd :)
Piotr Dobrogost

Jawaban:


8

Baru tahu bahwa saya harus menggunakan

Type=forking

seperti dijelaskan di http://www.freedesktop.org/software/systemd/man/systemd.service.html .

Jika diatur ke forking, diharapkan proses yang dikonfigurasikan dengan ExecStart = akan memanggil fork () sebagai bagian dari start-up-nya. Proses induk diharapkan untuk keluar ketika start-up selesai dan semua saluran komunikasi diatur. Anak itu terus berjalan sebagai proses daemon utama. Ini adalah perilaku daemon tradisional UNIX. Jika pengaturan ini digunakan, disarankan untuk juga menggunakan opsi PIDFile =, sehingga systemd dapat mengidentifikasi proses utama daemon. systemd akan melanjutkan dengan memulai unit tindak lanjut segera setelah proses induk keluar.


1

Untuk socat , saya menggunakan pendekatan systemd murni . Ini adalah contoh untuk 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

Ini dapat ditulis ke /etc/systemd/system/socat-serial-lo.service(dalam Ubuntu 16.04+), dan kemudian:

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

Satu keuntungan dari metode ini adalah bahwa baris perintah yang ditentukan oleh ExecStartdapat diuji langsung dari baris perintah tanpa perubahan, untuk menguji perintah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.