我编写了一个systemd单元生成器,它生成简单的套接字和服务单元,接受连接并将它们交给systemd-socket-proxyd
。在Ubuntu 16.04系统(systemd 229)上,systemctl daemon-reload
运行生成器,生成的单元显示在/run/systemd/generator/
中:
# cat /run/systemd/generator/sdtcpproxy-127.0.0.1-5555.socket
[Unit]
Description=TCP proxy to 127.0.0.1:5555
Requires=network-online.target
After=network.target network-online.target multi-user.target
[Socket]
ListenStream=127.0.0.1:5500
ListenStream=127.0.0.1:5551
[Install]
WantedBy=sockets.target
(我最初并没有使用Requires
和After
行;我试图确保它在合适的时间开始。我实际上并不认为他们是必要的。)
但他们开始禁用:
sdtcpproxy-127.0.0.1-5555.socket - TCP proxy to 127.0.0.1:5555
Loaded: loaded (/run/systemd/generator/sdtcpproxy-127.0.0.1-5555.socket; bad; vendor preset: enabled)
Active: inactive (dead)
Listen: 127.0.0.1:5500 (Stream)
127.0.0.1:5551 (Stream)
根据{{1}}, sockets.target
处于有效状态。我不清楚上述消息中的systemctl status
是否真的是一个真正的问题,或者它是bug #2348。
bad
会生成错误消息systemctl enable
。装置上的Failed to execute operation: No such file or directory
启动它,它运行得很好。
我做错了什么或遗忘在这里?
答案 0 :(得分:0)
邮件中的bad
不是问题;这只是systemd
特定版本中的一个错误。
问题是.socket
单元未启用。无法以正常方式启用生成的单位(systemctl enable
不查看/run/systemd/generator/
或单位文件的类似路径);它必须由生成器本身启用,方法是创建一个适当的.wants
子目录,其中包含符号链接到其中的单位,就像systemctl enable
对非生成单位一样。所以在这种情况下,让生成器为它创建单元和符号链接:
/run/systemd/generator/sdtcpproxy-127.0.0.1-5555.socket
/run/systemd/generator/socket.target.wants/sdtcpproxy-127.0.0.1-5555.socket
-> /run/systemd/generator/sdtcpproxy-127.0.0.1-5555.socket
当您的系统启动或您执行systemctl daemon-reload
systemd时,将启动将接听的套接字单元,并在收到第一个连接时启动.service
单元。