【进程】进程管理
查看進程
1. ps
查看某個時間點的進程信息。
示例一:查看自己的進程
# ps -l示例二:查看系統所有進程
# ps aux示例三:查看特定的進程
# ps aux | grep threadx2. pstree
查看進程樹。
示例:查看所有進程樹
# pstree -A3. top
實時顯示進程信息。
示例:兩秒鐘刷新一次
# top -d 24. netstat
查看占用端口的進程
示例:查看特定端口的進程
# 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
當一個子進程改變了它的狀態時(停止運行,繼續運行或者退出),有兩件事會發生在父進程中:
- 得到 SIGCHLD 信號;
- waitpid() 或者 wait() 調用會返回。
其中子進程發送的 SIGCHLD 信號包含了子進程的信息,比如進程 ID、進程狀態、進程使用 CPU 的時間等。
在子進程退出時,它的進程描述符不會立即釋放,這是為了讓父進程得到子進程信息,父進程通過 wait() 和 waitpid() 來獲得一個已經退出的子進程的信息。
?
wait()
pid_t wait(int *status)父進程調用 wait() 會一直阻塞,直到收到一個子進程退出的 SIGCHLD 信號,之后 wait() 函數會銷毀子進程并返回。
如果成功,返回被收集的子進程的進程 ID;如果調用進程沒有子進程,調用就會失敗,此時返回 -1,同時 errno 被置為 ECHILD。
參數 status 用來保存被收集的子進程退出時的一些狀態,如果對這個子進程是如何死掉的毫不在意,只想把這個子進程消滅掉,可以設置這個參數為 NULL。
waitpid()
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 進程就會釋放所有的僵尸進程所占有的資源,從而結束僵尸進程。
轉載于:https://www.cnblogs.com/itplay/p/11102679.html
總結
- 上一篇: JAVA静态方法是否可以被继承
- 下一篇: Linux Restart PHP