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