我编写了一个小守护进程,它在启动时启动,并像写入日志文件一样完美地完成所有操作。但我想知道,我们如何检查该进程是否是守护进程?我的教授告诉我一个命令
ps -xj | grep daemon
(我的文件名是daemon
),但我对此并不确信,因为它显示了不需要的信息。有没有相关的 shell 命令?
编辑:我正在使用 Ubuntu 14.04 LTS
答案1
大多数情况下,PPID 为 1 的任何东西都可能是守护进程。但在某些情况下,进程可能会成为 1 的子进程,而这些进程在技术上并不是守护进程。因此,我下面讨论的方法是为了演示如何确定 PID 是否属于 1,而不一定是其实际的守护进程。
例如
$ ps -xj
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
8420 1211 1211 8420 pts/4 1211 S+ 1000 0:01 ssh dufresne
1 2276 2275 2275 ? -1 Sl 1000 0:48 /usr/bin/gnome-keyring-daemon --daemonize --login
2196 2278 2278 2278 ? -1 Ssl 1000 0:39 gnome-session
1 2288 2278 2278 ? -1 S 1000 0:00 dbus-launch --sh-syntax --exit-with-session
1 2289 2289 2289 ? -1 Ssl 1000 6:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
1 2358 2289 2289 ? -1 Sl 1000 0:01 /usr/libexec/gvfsd
维基百科的摘录也可以阐明一些事情,但对于如何实际确定进程是否是守护进程也有些模糊。
摘自维基百科在 Unix 环境中,守护进程的父进程通常(但并非总是)是 init 进程。守护进程通常由进程创建子进程并立即退出,从而导致 init 采用子进程,或者由 init 进程直接启动守护进程。此外,通过分叉和退出启动的守护进程通常必须执行其他操作,例如将进程与任何控制终端 (tty) 分离。这些过程通常在各种方便的例程中实现,例如 Unix 中的 daemon(3)。
笔记:在使用 SystemD 的系统(Red Hat 发行版,例如 Fedora)上,通常没有init
进程,而是这样:
$ ps -j -1
PID PGID SID TTY STAT TIME COMMAND
1 1 1 ? Ss 0:42 /usr/lib/systemd/systemd --switched-root --system --deserialize 20
这就是 PID 1 的过程。
在 Debian/Ubuntu 系统上,他们将有一个仍名为 的进程init
:
$ ps -j -1
PID PGID SID TTY STAT TIME COMMAND
1 1 1 ? Ss 0:02 /sbin/init
那么什么是守护进程呢?
这就是当 PPID 为 1 时确定某个东西是否为守护进程可能会很棘手的原因:
进程可以成为 init 进程的子进程,(笔记:该init
进程的 PID 为 1),当其父进程被杀死或与其断绝关系时,这些进程不一定是守护进程,但仍会显示为 PPID 等于 1。
因此,要确定某个东西是否是守护进程,可能需要进行一系列测试,而不仅仅是查看它的 PPID 是否为 1。
那么我们会怎样呢?
要确定某个东西是否是守护进程,您可能必须采取各种测试,例如:
- PPID 1?
- TTY 连接了吗?
- 这是一项服务吗?
sudo service ...
? - 它是由 Systemd、Upstart 还是 SysV 管理的?
- 它正在监听端口吗?
- 它写入日志文件吗?系统日志?
所以我们不得不求助于“鸭子打字”,如果它嘎嘎叫,并且游泳,它很可能是一只鸭子,但即使是上述特征也可能会欺骗你。
参考
答案2
无法区分常规进程和守护进程。守护进程可以从任何地方启动,而不仅仅是 init。无需双重分叉并从终端分离即可被视为守护进程。
在 GNOME 系统上, gnome-settings-daemon 保留其父进程,登录到父进程的终端,并且不将 PID1 作为其父进程 PID,但它仍然被视为守护进程。
守护进程只是一个持续运行的进程。因此,它们不可能通过一个命令来识别。
现在,如果您想知道您的特定守护进程是否正在运行,请查看该pgrep
命令。
另外,更改守护程序的名称,已经有一个名为 daemon 的命令,您最终可能会与之冲突。