我正在编写一个shell脚本,希望在启动时作为守护程序运行,而无需使用daemontools或daemonize之类的外部工具。
Linux守护程序编写方法
根据Linux Daemon Writing HOWTO的规定,适当的守护程序具有以下特征:
- 来自父进程的分叉
- 关闭所有文件描述符(即
stdin
,stdout
,stderr
) - 打开写入日志(如果已配置)
- 将工作目录更改为永久目录(通常为
/
) - 重置文件模式掩码(umask)
- 创建一个唯一的会话ID(SID)
守护简介
该守护进程介绍更进一步,指出一个典型的守护程序也:
- 从其控制终端取消关联(如果有),并忽略所有终端信号
- 从其流程组中脱离
- 处理
SIGCLD
我将如何做到这一切的sh
,dash
或bash
只用普通的Linux工具脚本?
尽管Debian是我们的主要重点,但该脚本应该能够在尽可能多的发行版上运行而无需其他软件。
注意:我知道在StackExchange网络上有很多建议使用nohup
或的答案setsid
,但是这些方法都不能满足上述所有要求。
编辑:该守护进程(7)用户手册还给出了一些三分球,虽然似乎有老式的之间的一些差异SysV
守护程序和更新systemd
的。由于与各种发行版的兼容性很重要,因此请确保答案清楚说明所有差异。
daemon
事情用于运行任意的 shell脚本,而无须以一个守护程序。由于您是作者,因此完全可以控制该脚本的编写方式,因此可以直接从systemd unitfile或rc.d脚本启动该脚本。您确实指定了“正确”!