我正在尝试将 bash 脚本设置为侦听 tcp 端口 6666 的网络服务。但是服务在启动时失败并出现以下错误:
heartbeat]# systemctl status heartbeat.service
● heartbeat.service - Service de collecte des signaux de vie
Loaded: loaded (/etc/systemd/system/heartbeat.service; disabled; vendor preset: disabled)
Active: failed (Result: resources)
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Got more than one socket.
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Failed to run 'start' task: Invalid argument
mai 12 12:32:48 Chalet systemd[1]: Failed to start Service de collecte des signaux de vie.
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Unit entered failed state.
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Failed with result 'resources'.
mai 12 12:33:18 Chalet systemd[1]: heartbeat.service: Got more than one socket.
mai 12 12:33:18 Chalet systemd[1]: heartbeat.service: Failed to run 'start' task: Invalid argument
mai 12 12:33:18 Chalet systemd[1]: Failed to start Service de collecte des signaux de vie.
mai 12 12:33:18 Chalet systemd[1]: heartbeat.service: Failed with result 'resources'.
我不明白这条消息“heartbeat.service:有多个套接字”的含义。你能帮我理解我错在哪里吗?
我这样配置 systemd :
心跳.socket :
[Unit]
Description=Socket pour le demon heartbeat
PartOf=heartbeat.service
[Socket]
ListenStream=0.0.0.0:6666
Accept=true
[Install]
WantedBy=sockets.target
心跳.服务:
[Unit]
Description=Service de collecte des signaux de vie
After=network.target heartbeat.socket
Requires=heartbeat.socket
[Service]
Type=simple
ExecStart=/bin/bash /usr/heartbeat/heartbeat.bash
RemainAfterExit=no
StandardInput=socket
StandardOutput=inherit
[Install]
WantedBy=multi-user.target
/usr/heartbeat/heartbeat.bash 是:
#!/bin/bash
while true
do
read -r entree
if [[ $entree == "frequence" ]]
then
echo "3600"
fi
if [[ -n $entree ]]
then
logger "heartbeat receveid : $entree"
fi
done
答案1
重命名heartbeat.service[电子邮件受保护]完成了工作。
答案就在 systemd.socket 联机帮助页中(如果一次还不够,则 RTFM 两次...):
对于每个套接字文件,必须存在一个匹配的服务文件,描述在套接字上的传入流量上启动的服务(有关 .service 文件的更多信息,请参阅 systemd.service(5))。 .service 单元的名称默认与 .socket 单元的名称相同,但可以使用下面描述的 Service= 选项进行更改。根据下面描述的 Accept= 选项的设置,此 .service 单元必须像 .socket 单元那样命名,但替换后缀,除非用 Service= 覆盖;或者它必须是一个以相同方式命名的模板单元。示例:如果设置 Accept=false,套接字文件 foo.socket 需要匹配的服务 foo.service。如果设置Accept=true,则服务模板文件[电子邮件受保护]必须存在,为每个传入连接实例化服务。
因此,该服务不必启动,因为它是由 systemd 实例化并由套接字单元触发的(必须启动该服务来侦听传入连接的 tcp 端口)
由于我们没有为实例提供任何名称,因此对于那些对服务中 %I 给出的实例名称感到好奇的人,它似乎是实例编号减一(即第一个实例的 ID 为 0) :
[root@Chalet ~]# systemctl status heartbeat.socket
● heartbeat.socket - Socket pour le demon heartbeat
Loaded: loaded (/etc/systemd/system/heartbeat.socket; disabled; vendor preset: disabled)
Active: active (listening) since Mon 2017-05-15 15:25:03 CEST; 7h ago
Listen: 0.0.0.0:6666 (Stream)
Accepted: 5; Connected: 5
mai 15 15:25:03 Chalet systemd[1]: Listening on Socket pour le demon heartbeat.
[root@Chalet ~]# ncat 127.0.0.1 6666
what is %I in the service ?
^C
[root@Chalet ~]# systemctl status heartbeat.socket
● heartbeat.socket - Socket pour le demon heartbeat
Loaded: loaded (/etc/systemd/system/heartbeat.socket; disabled; vendor preset: disabled)
Active: active (listening) since Mon 2017-05-15 15:25:03 CEST; 7h ago
Listen: 0.0.0.0:6666 (Stream)
Accepted: 6; Connected: 6
mai 15 15:25:03 Chalet systemd[1]: Listening on Socket pour le demon heartbeat.
[root@Chalet ~]# journalctl -ra
-- Logs begin at Sat 2016-11-19 19:12:18 CET, end at Mon 2017-05-15 23:02:21 CEST. --
mai 15 23:02:21 Chalet root[7224]: heartbeat receveid : what is %I in the service ?
mai 15 23:01:43 Chalet systemd[1]: Started Service de collecte des signaux de vie pour 5 (127.0.0.1:50920).