Di chuyển tập lệnh init socat sang systemd


8

Tôi sử dụng socat với đoạn script init trên debian 7.2 với sysVinit. Nó hoạt động hoàn hảo:

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

Tuy nhiên, sau khi nâng cấp lên debian 7.4, hệ thống đã đổi thành systemd. Vì vậy, để chạy cùng một tập lệnh trên systemd, tôi đã thêm một dịch vụ bao bọc tập lệnh /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

Khi tôi bắt đầu dịch vụ, nó được khởi động nhưng dừng trực tiếp:

Đã tải: đã tải (/usr/lib/systemd/system/socat.service; đã bật)
Hoạt động: không hoạt động (đã chết) kể từ Thứ Sáu, 18 tháng 4 năm 2014 14:09:46 +0200; Cách đây 4 giây Quá trình: 5334 ExecStart = / etc / init.d / socat start (code = exited, status = 0 / SUCCESS) Cgroup: name = systemd: /system/socat.service

Tui bỏ lỡ điều gì vậy?


Tui bỏ lỡ điều gì vậy? Có, bạn đã bỏ lỡ thực sự di chuyển tập lệnh init.d sang systemd :)
Piotr Dobrogost

Câu trả lời:


8

Chỉ cần tìm ra rằng tôi phải sử dụng

Type=forking

như được mô tả trong http://www.freedesktop.org/software/systemd/man/systemd.service.html .

Nếu được đặt thành forking, dự kiến ​​quy trình được cấu hình với ExecStart = sẽ gọi fork () là một phần của quá trình khởi động. Quá trình cha mẹ dự kiến ​​sẽ thoát khi khởi động hoàn tất và tất cả các kênh truyền thông được thiết lập. Đứa trẻ tiếp tục chạy như là quá trình daemon chính. Đây là hành vi của daemon UNIX truyền thống. Nếu cài đặt này được sử dụng, bạn cũng nên sử dụng tùy chọn PIDFile = để systemd có thể xác định quy trình chính của daemon. systemd sẽ tiến hành bắt đầu các đơn vị theo dõi ngay khi tiến trình cha mẹ thoát ra.


1

Đối với socat , tôi sử dụng một cách tiếp cận systemd thuần túy . Đây là một ví dụ cho một loopback nối tiếp:

[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

Điều này có thể được ghi vào /etc/systemd/system/socat-serial-lo.service(trong Ubuntu 16.04+), và sau đó:

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

Một lợi thế của phương pháp này là dòng lệnh được xác định bởi ExecStartcó thể được kiểm tra trực tiếp từ dòng lệnh mà không cần thay đổi, để kiểm tra lệnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.