如何检查一个进程是否是守护进程?

如何检查一个进程是否是守护进程?

我编写了一个小守护进程,它在启动时启动,并像写入日志文件一样完美地完成所有操作。但我想知道,我们如何检查该进程是否是守护进程?我的教授告诉我一个命令 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 的命令,您最终可能会与之冲突。

相关内容