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。
要确定某个东西是否是守护进程,您可能不得不求助于各种测试,例如:
sudo service ...
?所以我们不得不求助于“鸭子打字”,如果它嘎嘎叫,游泳,它很可能是一只鸭子,但即使是上述特征也可以欺骗你。
无法区分常规进程和守护进程。守护进程可以从任何地方启动,而不仅仅是 init。没有必要双重 fork 并从终端分离才能被视为守护进程。
在 GNOME 系统上,gnome-settings-daemon 保留其父进程,登录到父进程的终端,并且不将 PID1 作为其父进程 PID,但它仍被视为守护进程。
守护进程只是一个持续运行的进程。因此,他们不可能用一个命令来识别。
现在,如果您想知道您的特定守护程序是否正在运行,请查看pgrep
命令。
另外,更改守护程序的名称,已经有一个名为 daemon 的命令,您最终可能会与之冲突。