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

Pra*_*jal 8 shell bash c daemon

我写了一个小守护进程,它在启动时启动,并且像写入日志文件一样完美地完成所有事情。但是我想知道,我们如何检查该进程是否为守护进程?我的教授告诉我一个命令 ps -xj | grep daemon(我的文件名是daemon),但我不相信它,因为它显示了不需要的信息。是否有任何shell命令?

编辑:我使用的是 Ubuntu 14.04 LTS

slm*_*slm 10

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
Run Code Online (Sandbox Code Playgroud)

维基百科的摘录也可以阐明一些事情,但它也使如何实际确定进程是否为守护进程有些模糊。

摘自维基百科

在 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
Run Code Online (Sandbox Code Playgroud)

这就是PID 1的过程。

在 Debian/Ubuntu 系统上,他们将有一个仍名为的进程init

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:02 /sbin/init
Run Code Online (Sandbox Code Playgroud)

那么什么是守护进程?

这就是当它的 PPID 为 1 时确定某个东西是否是守护进程可能很棘手的原因:

一个进程可以成为 init 进程的子进程(注意:init进程是 PID 1),当它们的父进程被杀死或否认它们时,这些进程不一定是守护进程,但仍会显示为它们的 PPID 等于 1

因此,要确定某个东西是否是守护进程,可能需要进行一系列测试,而不是简单地查看它的 PPID 是否为 1。

那么,这让我们何去何从?

要确定某个东西是否是守护进程,您可能不得不求助于各种测试,例如:

  • PPID 1?
  • TTY 连接了吗?
  • 是服务吗?sudo service ...?
  • 它是由 Systemd、Upstart 还是 SysV 管理的?
  • 它正在侦听端口吗?
  • 它是写入日志文件吗?系统日志?

所以我们不得不求助于“鸭子打字”,如果它嘎嘎叫,游泳,它很可能是一只鸭子,但即使是上述特征也可以欺骗你。

参考

  • ppid=1 不是守护进程的可靠指标。许多不是守护进程的进程在它们的父进程中幸存下来。相反,一些守护进程有一个监视程序或另一个进程与它们的父进程相同的守护进程。 (4认同)

Cam*_*emo 6

无法区分常规进程和守护进程。守护进程可以从任何地方启动,而不仅仅是 init。没有必要双重 fork 并从终端分离才能被视为守护进程。

在 GNOME 系统上,gnome-settings-daemon 保留其父进程,登录到父进程的终端,并且不将 PID1 作为其父进程 PID,但它仍被视为守护进程。

守护进程只是一个持续运行的进程。因此,他们不可能用一个命令来识别。

现在,如果您想知道您的特定守护程序是否正在运行,请查看pgrep命令。

另外,更改守护程序的名称,已经有一个名为 daemon 的命令,您最终可能会与之冲突。

  • 没有附加的 TTY 应该被视为与守护进程有很强的相关性(可能比 PPID 1 大得多)。 (3认同)