저는 sysVinit과 함께 debian 7.2에서 socat과 다음 init 스크립트를 사용하고 있습니다. 완벽하게 작동합니다.
#!/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
그러나 debian 7.4로 업그레이드한 후 시스템이 systemd로 변경되었습니다. 따라서 systemd에서 동일한 스크립트를 실행하기 위해 /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
서비스를 시작하면 시작되지만 바로 중지됩니다.
로드됨: 로드됨(/usr/lib/systemd/system/socat.service; 활성화됨)
활성: 2014년 4월 18일 금요일 14:09:46 +0200부터 4초 전 프로세스: 5334 ExecStart=/etc/init .d/socat 시작(코드=종료, 상태=0/SUCCESS) C그룹: 이름=systemd:/system/socat.service
내가 뭐 놓친 거 없니?
답변1
사용해야 한다는 걸 방금 알아냈어요
Type=forking
설명대로http://www.freedesktop.org/software/systemd/man/systemd.service.html.
분기로 설정된 경우 ExecStart=로 구성된 프로세스는 시작의 일부로 분기()를 호출해야 합니다. 시작이 완료되고 모든 통신 채널이 설정되면 상위 프로세스가 종료될 것으로 예상됩니다. 하위 프로세스는 계속해서 기본 데몬으로 실행됩니다. 이는 전통적인 UNIX 데몬의 동작입니다. 이 설정을 사용하는 경우 systemd가 데몬의 기본 프로세스를 식별할 수 있도록 PIDFile= 옵션도 사용하는 것이 좋습니다. 상위 프로세스가 종료되면 systemd는 계속해서 후속 유닛을 시작합니다.
답변2
~을 위한소캇, 나는 순수를 사용합니다체계방법. 다음은 직렬 루프백의 예입니다.
[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
/etc/systemd/system/socat-serial-lo.service
(Ubuntu 16.04+에서) 다음과 같이 작성할 수 있습니다 .
systemctl daemon-reload
systemctl start socat-serial-lo
systemctl enable socat-serial-lo # (to start it during bootup)
ExecStart
이 접근 방식의 한 가지 장점은 명령을 테스트하기 위해 변경할 필요 없이 정의된 명령줄을 명령줄에서 직접 테스트할 수 있다는 것입니다 .