Socat and systemd

4

我需要运行一个脚本,其中包括运行socat等多个操作。从命令行运行该脚本没有问题,现在我想的是将该脚本作为服务运行。

以下是我拥有的脚本:

#!/usr/bin/env sh

set -e

TTY=${AQM_TTY:-/dev/ttyUSB0}

/reg_sesion/create
DESTINOS=(http://127.0.0.1)

LOG_DIR=./logs-aqm

mkdir -p "${LOG_DIR}"

###ADDED####

echo $$ > /var/run/colector.pid

socat -b 115200 ${TTY},echo=0,crnl - |

grep --line-buffered "^rs" |
while read post; do
for destino in ${DESTINOS[@]}; do
wget --post-data="$(echo "${post}" | tr -d "\n")" \
-O /dev/null \
--no-verbose \
--background \
--append-output="${LOG_DIR}/${destino//\/}.log" \
"${destino}/reg_sesion/create"
done

echo "${post}" | tee -a "${LOG_DIR}/aqm.log"
done

服务文件:

[Unit]
Description=colector

[Service]
Type=simple
PIDFile=/var/run/colector.pid

User=root
Group=root

#ExecStart=/root/socat.sh
ExecStart=/bin/sh -c '/root/socat.sh'

[Install]
WantedBy=multi-user.target 

当我启动服务时,进程会快速地启动和结束。
有什么想法吗?
感谢您的时间。

首先,将ExecStart行更改为ExecStart=/bin/sh -c '/root/socat.sh'或者如果您喜欢,可以使用/bin/bash代替/bin/sh。 我理解你的服务文件脚本是将/dev/ttyUSB0的数据输出到stdout,对吗?并且你设置了一个PIDFile。因此,systemd会查找该文件一段时间,如果没有这样的文件,它可能会认为服务已经失败,并强制结束进程。您必须将进程的pid放入/var/run/collector.pid文件中。 - Sergey Kanaev
我完全忘记了它: 在运行脚本之前,在socat中加入以下内容:echo $$ > /var/run/collector.pid - Sergey Kanaev
我按照您的要求修改了脚本,并添加了包含socat命令的完整脚本。 只有socat命令是因为他知道其他命令不起作用。 感谢您的时间。 - Gaspacho
服务是否处于活动状态? - Sergey Kanaev
不好意思,现在SD崩溃了(墨菲定律),我正在重新安装。 - Gaspacho
显示剩余2条评论
1个回答

3
请从您的服务文件中删除PIDFile=,然后查看它是否有效。 PIDFile=主要用于Type=forking,在这种情况下,您的启动程序将分叉一个子进程,因此您告诉SYSTEMD(通过PIDFile)来监视该进程。 在Type=simple情况下,对于长时间运行的服务,SYSTEMD会创建一个子进程来启动您的服务,因此它知道PID是多少。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接