如何檢查一個行程是否為守護程式?

如何檢查一個行程是否為守護程式?

我編寫了一個小守護進程,它在啟動時啟動,並像寫入日誌檔案一樣完美地完成所有操作。但我想知道,我們如何檢查該進程是否是守護程式?我的教授告訴我一個命令 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 的命令,您最終可能會與之衝突。

相關內容