如何在Linux系統中查詢守護程序和殭屍程序列表


本文將指導您瞭解殭屍程序和守護程序,並幫助您找到在後臺執行的程序。

什麼是殭屍程序?

當程序結束執行時,它將向其父程序報告一個退出狀態。由於這少量的資訊,該程序將作為殭屍程序保留在作業系統程序表中,這表示它不會被安排在未來執行,但該程序無法被完全刪除,或者程序ID不會被使用,直到退出狀態被確定並且不再需要。

當子程序完成時,父程序將收到一個SIGCHLD訊號,表示其一個子程序已完成執行;父程序通常會在此時呼叫wait()系統呼叫。該呼叫將向父程序提供子程序的退出狀態,並將導致子程序被回收或從程序表中刪除。

守護程序?

Linux是一個多工作業系統。任何時候執行的每個程式都稱為一個程序。每個執行的命令至少啟動一個新程序,並且許多系統程序正在執行。

每個程序都由一個稱為程序ID (PID) 的數字標識。類似於檔案,每個程序都有其所有者和組,並且組和所有者許可權有助於識別哪些檔案和裝置與這些程序相關。大多數程序也有啟動它們的父程序。

**示例**: shell是一個程序,在shell中執行的任何命令都是屬於shell父程序的程序。例外情況是一個特殊的程序init(8),它是啟動時啟動的第一個程序,其PID(程序ID)為1。

某些程式需要持續的使用者輸入並且與終端斷開連線才能執行。例如,Web伺服器響應Web請求,而不是使用者輸入。郵件伺服器是此類應用程式的另一個示例。這些型別的程式也稱為守護程序。

前臺程序

每個程序都必須在前臺執行。它從鍵盤獲取輸入,並在程序之後將輸出傳送到螢幕。

您可以看到ls命令是如何工作的。如果我想列出我當前目錄中的所有檔案,可以使用以下命令:

這將顯示當前目錄中的所有檔案。

# ls
lost+found user1 user2

該程序在前臺執行,並將輸出定向到我的螢幕,如果命令需要任何輸入,它將等待輸入。

當程式在前臺執行並佔用大量時間時,我們無法從命令提示符執行任何其他命令,這些命令在程式完成處理之前都是不可用的。

後臺程序

後臺程序在沒有使用者互動的情況下執行。如果後臺程序需要任何輸入,它將等待。

在後臺執行程序的優點是您可以執行其他命令,並且不必等到它完成才能啟動另一個程序。

啟動後臺程序最簡單的方法是在執行的命令末尾新增一個取值符(&)。

# find . / > files

以上操作會將所有檔案和目錄的輸出寫入檔案file,這將花費更多時間。例如,行尾的取值符(&) 將在後臺作為程序執行,游標將來到提示符處等待另一個命令。

# find ./ > files &
[1] 76742
#

第一行包含有關後臺程序的資訊,例如正在執行多少個後臺程序以及作業編號或程序ID。我們需要知道PID才能在後臺和前臺之間操作它。

如果您現在按Enter鍵,我們將看到以下輸出

[1]+ Done find . / > files

第一行告訴您find命令後臺程序已成功完成並等待其他命令。

列出正在執行的程序

此命令將透過執行ps(程序狀態)命令來列出自己的程序。

# ps
PID    TTY       TIME CMD
69301  pts/0    00:00:00 bash
78926  pts/0    00:00:00 ps

ps常用的標誌是-f,-f將顯示完整資訊,如下所示提供更多資訊。

# ps -f
UID    PID    PPID    C    STIME    TTY    TIME CMD
root   69301 69261    0    13:34    pts/0  00:00:00 -bash
root   79099 69301    0    13:51    pts/0  00:00:00 ps -f

PS命令的完整用法

# ps --help
********* simple selection ********* ********* selection by list *********
-A all processes                          -C by command name
-N negate selection                       -G by real group ID (supports names)
-a all w/ tty except session leaders      -U by real user ID (supports names)
-d all except session leaders             -g by session OR by effective group name
-e all processes                          -p by process ID
                                          -q by process ID (unsorted & quick)
T all processes on this terminal          -s processes in the sessions given
a all w/ tty, including other users       -t by tty
g OBSOLETE -- DO NOT USE                  -u by effective user ID (supports names)
r only running processes                   U processes for specified users
x processes w/o controlling ttys           t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined    -f full              --Group --User --pid --cols --ppid
-j,j job control     s signal             --group --user --sid --rows --info
-O,O preloaded -o    v virtual memory     --cumulative --format --deselect
-l,l long             u user-oriented    --sort --tty --forest --version
-F extra full        X registers         --heading --no-heading --context
                                         --quick-pid
********* misc options *********
-V,V show version       L list format codes        f ASCII art forest
-m,m,-L,-T,H threads    S children in sum          -y change -l format
-M,Z security data      c true command name       -c scheduling class
-w,w wide output        n numeric WCHAN,UID          -H process hierarchy

停止程序

可以透過多種方式停止程序。通常,從命令列傳送CTRL + C按鍵 – 將退出命令。當程序在前臺執行時,這將起作用。

如果程序在後臺模式下執行,則首先需要使用**ps**命令獲取其作業ID,然後可以使用**kill**命令殺死該程序,如下所示:

# ps -f
UID    PID    PPID    C    STIME TTY       TIME CMD
root  69301   69261   0    13:34 pts/0    00:00:00 -bash
root  82913   69301   0    13:58 pts/0    00:00:00 ssh root@192.168.1.89
root  82952   69301   0    13:58 pts/0    00:00:00 ps -f

# kill 82913
Terminated

此處kill命令將終止ssh root@192.168.1.89。如果程序忽略常規kill,我們可以使用kill -9後跟程序ID,如下所示。

# ps -f
UID    PID    PPID     C    STIME TTY    TIME CMD
root    69301 69261    0 13:34 pts/0    00:00:00 -bash
root    83964 69301    0 14:00 pts/0    00:00:00 ps -f
[1]+    Killed                ssh root@192.168.1.89

我們如何檢視系統上是否正在執行殭屍程序?

執行“ps aux”並查詢STAT列中的Z。

# ps -aux
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER    PID    %CPU    %MEM    VSZ    RSS    TTY    STAT    START    TIME    COMMAND
root    11647 0.0 0.1 549100 7348 ? S Mar18 0:13 /usr/libexec/clock-applet --oaf-activate-iid=OAFIID:GNOME_ClockApplet_Factory --oaf-ior-fd=28
root 11648 0.0 0.1 400744 5552 ? S Mar18 0:00 /usr/libexec/gdm-user-switch-applet --oaf-activate-iid=OAFIID:GNOME_FastUserSwitchApplet_Factry --oaf-ior-fd=34
root 11649 0.0 0.1 290996 4072 ? S Mar18 0:00 /usr/libexec/notification-area-applet --oaf-activate-iid=OAFIID:GNOME_NotificationAreaApplet_Factory --oaf-ior-fd=40
root 11681 0.0 0.0 137416 1524 ? S Mar18 0:00 /usr/libexec/gvfsd-burn --spawner :1.9 /org/gtk/gvfs/exec_spaw/
root 11696 0.0 0.0 135276 1320 ? S Mar18 0:00 /usr/libexec/gvfsd-metadata
root 12196 0.0 0.0 0 0 ? Z Mar18 0:20 [yumBackend.py] <defunct
root 13284 0.0 0.1 303428 6212 ? Sl Mar18 0:00 gnome-terminal
root 13286 0.0 0.0 8228 620 ? S Mar18 0:00 gnome-pty-helpe
root 13287 0.0 0.0 108340 1340 pts/0 Ss+ Mar18 0:00 bas
root 14347 0.0 0.0 223336 3408 ? S 10:50 0:00 smbd -D
root 14578 0.0 0.4 425524 18172 ? Ss Mar25 0:21 /usr/sbin/http
apache 15091 0.0 1.5 414648 61904 ? S Apr05 0:44 php-fpm: pool ww
postfix 18359 0.0 0.0 80948 3384 ? S 12:24 0:00 pickup -l -t fifo -u

在上面的示例中,程序ID為12196的程序的狀態為z,使用kill命令殺死該程序

#kill -9 12196

閱讀本文後,您將能夠理解什麼是殭屍程序和守護程序,以及如何找到它們和如何停止它們,以及如何使程序在後臺執行。

更新於:2020年1月21日

5000+ 瀏覽量

啟動您的職業生涯

完成課程後獲得認證

開始學習
廣告
© . All rights reserved.