创建了一个可执行文件并计划将其用作服务。
当使用 upstart 在 Ubuntu 12.04 或 14.04 上运行时,它运行良好。
但是,在 Ubuntu 15.04(带有 systemd)上,此命令不会终止:
systemctl start mySrv01
可能是因为我没有关闭 stdin?upstart 似乎不介意。有什么想法吗?谢谢。
答案1
使用 upstart 时不需要这样做,不知道为什么。
您也不必使用 systemd 执行此操作。您的就绪协议不匹配。您的服务单元文件表明您的程序采用了Type=forking
就绪协议。但您的程序本身实际上并未采用。
准备forking
就绪协议很难正确执行,但很容易出错。几乎没有任何程序真正使用它。Type=simple
如果一开始就已是服务单元,只需创建服务单元即可。
此外,你不需要费尽心思尝试通过关闭打开的文件描述符等操作来实现“守护进程化”。你的程序已经是恶魔化了。
进一步阅读
- https://unix.stackexchange.com/a/200365/5132
- 乔纳森·德·博因·波拉德(2015年)。你真的不需要守护进程。真的。. systemd 恐怖屋。
答案2
事实证明,对于 systemd 来说,守护进程 mySrv01 必须分叉一个子进程,并且最好关闭 stdin。
使用 upstart 时不需要这样做,不知道为什么。