如何在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
閱讀本文後,您將能夠理解什麼是殭屍程序和守護程序,以及如何找到它們和如何停止它們,以及如何使程序在後臺執行。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP