如何列出所有正在執行的守護程序?
根據我的問題,守護程序的程序 ID 和會話 ID 可以不同嗎?,很明顯我不能輕易決定守護程序的特性。我在不同的文章和不同的論壇中讀到過該
service --status-all
命令可用於列出我係統中的所有守護程序。但我不認為該命令列出了所有守護程序NetworkManager
,因為該命令未列出目前在我的Ubuntu 14.04
系統中執行的守護程序。是否有一些命令可以列出正在執行的守護程序,或者是否有某種方法可以從filesystem
自身中找到守護程序?
守護程序的概念附加到程序,而不是文件。因此,“在文件系統上查找守護程序”毫無意義。只是為了讓這個概念更清楚一點:程序是一個執行檔(在 的輸出中可見
ls
);程序是該程序的一個實例(在 的輸出中可見ps
)。現在,如果我們使用我在回答中提供的資訊,我們可以通過搜尋在沒有連接控制終端的情況下執行的程序來找到正在執行的守護程序。這可以很容易地完成
ps
:$ ps -eo 'tty,pid,comm' | grep ^?
輸出欄位包含“
tty
?” 當程序沒有控制終端時。當您的系統執行圖形環境時,這裡的大問題就出現了。由於 GUI 程序(即 Chromium)沒有附加到終端,它們也出現在輸出中。在 root 不執行圖形程序的標準系統上,您可以簡單地將先前的列表限制為 root 的程序。這可以使用
ps
’-U
開關來實現。$ ps -U0 -o 'tty,pid,comm' | grep ^?
然而,這裡出現了兩個問題:
- 如果 root 正在執行圖形程序,它們會顯示出來。
- 沒有 root 權限執行的守護程序不會。請注意,在引導時啟動的守護程序通常以 root 身份執行。
基本上,我們希望在沒有控制終端的情況下顯示所有程序,而不是 GUI 程序。幸運的是,有一個程序可以列出 GUI 程序:
xlsclients
!來自 slm 的這個答案告訴我們如何使用它來列出所有 GUI 程序,但我們必須反轉它,因為我們想要排除它們。這可以使用--deselect
開關來完成。首先,我們將建立一個我們正在執行的程序的所有 GUI 程序的列表。從我剛剛連結的答案中,這是使用…完成的
$ xlsclients | cut -d' ' -f3 | paste - -s -d ','
現在,
ps
有一個-C
允許我們按命令名稱選擇的開關。我們剛剛得到了我們的命令列表,所以讓我們將它注入到ps
命令行中。請注意,我--deselect
稍後會使用它來反轉我的選擇。$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect
現在,我們有一個所有非 GUI 程序的列表。讓我們不要忘記我們的“不附加 TTY”規則。為此,我將添加
-o tty,args
到上一行以輸出tty
每個程序(及其完整的命令行):$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?
final
grep
擷取所有以“?”開頭的行,即所有沒有控制 tty 的程序。你去吧!最後一行為您提供了在沒有控制終端的情況下執行的所有非 GUI 程序。請注意,您仍然可以改進它,例如,通過排除核心執行緒(不是程序)……$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?
…或添加幾列資訊供您閱讀:
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?