查看某個時間點的進程信息。git
示例一:查看本身的進程github
# ps -l
示例二:查看系統全部進程shell
# ps aux
示例三:查看特定的進程函數
# ps aux | grep threadx
查看進程樹。spa
示例:查看全部進程樹blog
# pstree -A
實時顯示進程信息。隊列
示例:兩秒鐘刷新一次進程
# top -d 2
查看佔用端口的進程事件
示例:查看特定端口的進程資源
# netstat -anp | grep port
狀態 | 說明 |
---|---|
R | running or runnable (on run queue) 正在執行或者可執行,此時進程位於執行隊列中。 |
D | uninterruptible sleep (usually I/O) 不可中斷阻塞,一般爲 IO 阻塞。 |
S | interruptible sleep (waiting for an event to complete) 可中斷阻塞,此時進程正在等待某個事件完成。 |
Z | zombie (terminated but not reaped by its parent) 僵死,進程已經終止可是還沒有被其父進程獲取信息。 |
T | stopped (either by a job control signal or because it is being traced) 結束,進程既能夠被做業控制信號結束,也多是正在被追蹤。 |
當一個子進程改變了它的狀態時(中止運行,繼續運行或者退出),有兩件事會發生在父進程中:
其中子進程發送的 SIGCHLD 信號包含了子進程的信息,好比進程 ID、進程狀態、進程使用 CPU 的時間等。
在子進程退出時,它的進程描述符不會當即釋放,這是爲了讓父進程獲得子進程信息,父進程經過 wait() 和 waitpid() 來得到一個已經退出的子進程的信息。
pid_t wait(int *status)
父進程調用 wait() 會一直阻塞,直到收到一個子進程退出的 SIGCHLD 信號,以後 wait() 函數會銷燬子進程並返回。
若是成功,返回被收集的子進程的進程 ID;若是調用進程沒有子進程,調用就會失敗,此時返回 -1,同時 errno 被置爲 ECHILD。
參數 status 用來保存被收集的子進程退出時的一些狀態,若是對這個子進程是如何死掉的絕不在乎,只想把這個子進程消滅掉,能夠設置這個參數爲 NULL。
pid_t waitpid(pid_t pid, int *status, int options)
做用和 wait() 徹底相同,可是多了兩個可由用戶控制的參數 pid 和 options。
pid 參數指示一個子進程的 ID,表示只關心這個子進程退出的 SIGCHLD 信號。若是 pid=-1 時,那麼和 wait() 做用相同,都是關心全部子進程退出的 SIGCHLD 信號。
options 參數主要有 WNOHANG 和 WUNTRACED 兩個選項,WNOHANG 可使 waitpid() 調用變成非阻塞的,也就是說它會當即返回,父進程能夠繼續執行其它任務。
一個父進程退出,而它的一個或多個子進程還在運行,那麼這些子進程將成爲孤兒進程。
孤兒進程將被 init 進程(進程號爲 1)所收養,並由 init 進程對它們完成狀態收集工做。
因爲孤兒進程會被 init 進程收養,因此孤兒進程不會對系統形成危害。
一個子進程的進程描述符在子進程退出時不會釋放,只有當父進程經過 wait() 或 waitpid() 獲取了子進程信息後纔會釋放。若是子進程退出,而父進程並無調用 wait() 或 waitpid(),那麼子進程的進程描述符仍然保存在系統中,這種進程稱之爲殭屍進程。
殭屍進程經過 ps 命令顯示出來的狀態爲 Z(zombie)。
系統所能使用的進程號是有限的,若是產生大量殭屍進程,將由於沒有可用的進程號而致使系統不能產生新的進程。
要消滅系統中大量的殭屍進程,只須要將其父進程殺死,此時殭屍進程就會變成孤兒進程,從而被 init 進程所收養,這樣 init 進程就會釋放全部的殭屍進程所佔有的資源,從而結束殭屍進程。