我有以下服务。
/etc/systemd/system/Detectwifi.service
[Unit]
Description=wifi detect automation
Requires=wpa_supplicant.service
After=wpa_supplicant.service
[Service]
Type=simple
ExecStart=/sbin/wpa_cli -a /home/pi/test.sh -B
Restart=always
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
然后我启动服务,我看到命令wpa_cli -a /home/pi/test.sh -B
正在运行。然后杀掉这个进程就不会再重新启动了。
我可以知道重启不起作用的原因吗?
另外,如果我注释该行RemainAfterExit=yes
,那么服务将开始重新启动,但即使进程成功运行,它也会不断重新启动。
答案1
保留-B
并切换到程序未提及的准备协议的建议是为什么人们应该始终对评论答案持高度怀疑的另一个例子。
RemainAfterExit=yes
当它是谎言时不要使用,就像这里一样。你的守护进程不是当进程退出时认为正在运行。- 不使用
-B
。无论如何,守护进程的想法都是一个谬论,而你的过程已经开始在守护进程上下文中。
您将遇到的一个问题是 systemd 不知道您的服务不应运行,直到相关wpa_supplicant
服务将其控制套接字绑定到/run/wpa_supplicant/
.这里存在时间问题,人们只能在服务“接受”之前不断地重新启动。
wpa_supplicant
尚未提供一种方法将其控制套接字作为已打开的文件描述符传入,这将允许使用 systemd 套接字单元来定义它,然后wpa_cli
可以在该单元之后订购服务单元。
进一步阅读
- 乔纳森·德博因·波拉德 (2001)。 设计 Unix 守护程序时要避免的错误。经常给出的答案。
- 乔纳森·德博因·波拉德 (2015)。您确实不需要守护进程。真的。。 systemd 恐怖屋。
- 乔纳森·德博因·波拉德 (2015)。Unix 守护进程的就绪协议问题。经常给出的答案。
- 奇拉格·纳塔拉杰 (2019)。 使用 systemd 的简约无线网络。 chiraag.nataraj.us。
- https://unix.stackexchange.com/a/401611/5132