linux進程管理簡析
linux多任務概念:
linux採用分時管理的方法,所有的任務都放在一個隊列中,操作系統根據每個任務的優先級爲每個任務分配合適的時間片,從而使所有的任務共同分享系統資源,因此linux可以在一個任務還未執行完成時,暫時掛起此任務,又去執行另一個任務,過一段時間以後再回來處理這個任務,直到這個任務完成,才從任務隊列中去除,這個就是多任務的概念。
進程:在自身的虛擬地址空間運行的一個獨立的程序,從操作系統的角度來看,所有在系統上運行的東西,都可以稱爲一個進程。
程序和進程的區別:進程由程序產生單並不是程序。程序是一個進程指令的結合。程序佔用磁盤空間。進程佔用內存空間,是動態,可變的,關閉進程,佔用的內存資源隨之釋放。
進程的分類:
系統進程:可以執行內存資源分配和進程切換等管理工作,而且,該進程不受用戶干預,(root也不可以)
用ps -ef 查看 [] 包含的進程一般爲系統進程。
用戶進程:通過執行用戶程序,應用程序或內核之外的系統程序而產生的進程,用戶控制。
對於用戶進程:分爲交互進程,批處理進程和守護進程三類。
1.交互進程:由一個shell終端啓動的進程,需要與用戶進行交互操作,可運行與前臺或後臺
2.批處理進程:一個進程集合,負責按順序啓動其他的進程
3.守護進程:一直運行着的進程,直到系統關閉。比如crond。還有開啓的httpd進程。
linux進程的幾個狀態
1. Linux進程狀態:R (TASK_RUNNING),可執行狀態&運行狀態(在run_queue隊列裏的狀態)
2. Linux進程狀態:S (TASK_INTERRUPTIBLE),可中斷的睡眠狀態, 可處理signal
3. Linux進程狀態:D (TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態, 可處理signal, 有延遲
4. Linux進程狀態:T (TASK_STOPPED or TASK_TRACED),暫停狀態或跟蹤狀態, 不可處理signal, 因爲根本沒有時間片運行代碼
5. Linux進程狀態:Z (TASK_DEAD - EXIT_ZOMBIE),退出狀態,進程成爲殭屍進程。不可被kill, 即不響應任務信號, 無法用SIGKILL殺死
進程之間的關係。
在linux系統中,進程ID(用PID表示)是區分不同進程的唯一標識。它的大小有限最大ID32768,所有的進程都是PID爲1的init進程的後代,內核在系統啓動的最後階段啓動init進程。因此,這個進程時linux下所有及暱稱的父進程,用PPID表示父進程。每個進程作爲子進程都必須由父進程管理。當父進程停止,子進程也隨之消失。僵死狀態就是子進程結束。父進程沒有釋放系統資源。
常用命令:
1. ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:20 ? 00:00:01 /usr/lib/systemd/systemd
其中,UID是用戶的ID標識號,PID是進程的標識號,PPID表示父進程,STIME表示進程的啓動時間,TTY表示進程所屬的終端控制檯,TIME表示進程啓動後累計使用的CPU總時間,CMD表示正在執行的命令。
# ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 03:20 0:00 [kthreadd]
其中,%CPU表示進程佔用的CPU百分比,%MEM表示進程佔用內存的百分比,VSZ表示進程虛擬大小,RSS表示進程的實際內存(駐留集)大小(單位是頁)。STAT表示進程的狀態,進程的狀態有很多種:用“R”表示正在運行中的進程,用“S”表示處於休眠狀態的進程, 用“Z”表示僵死進程,用“<”表示優先級高的進程,用“N”表示優先級較低的進程,用“s”表示父進程,用“+”表示位於後臺的進程。START表示啓動進程的時間。
2. pstree 以樹形結構顯示程序和進程之間的關係。
格式 : pstree [-acnpu] [<PID>/<user>]
選項含義如下:
-a 顯示啓動每個進程對應的完整指令,包括啓動進程的路徑,參數等等。
-c 顯示過程中包含子進程和父進程
-n 根據進程PID來排序輸出,默認以程序名稱排序輸出
-p 顯示進程PID
-u 顯示進程對應的用戶名稱
PID 進程對應的PID 號
user 系統用戶名
3.top
4.lsof (list opened files) 列舉系統中已經被打開的文件
lsof filename 顯示使用filename文件的進程
lsof -c softname 顯示 進程打開的文件數
這個數字受系統限制 ulimit -a
lsof -p PID 根據進程號顯示進程打開的文件
lsof -i 通過監聽指定的協議、端口、主機等信息,顯示符合條件的進程信息。
5.pgrep 通過程序名字來查詢進程pid的工具
參數:
-l 此參數列出程序名和進程ID值
-o 此參數用來顯示進程起始ID值
-n 此參數用來顯示進程終止ID值
-f 匹配command中的關鍵字 (如果想匹配mysqld 如果有-F 參數可以寫成 my就可以找到mysqld)
-G 此參數匹配指定組啓動的進程相應的ID值。
對比命令:查找進程的PID
# ps -ef | grep mysqld| grep -v grep|awk '{print $2}'
2713
2858
# pgrep mysql
2713
2858
crond任務計劃:
主配置文件:/etc/crontab
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,
sat
# | | | | |
# * * * * * user-name command to be executed
minute: 表示分鐘,可以是從0到59之間的任何整數。
hour:表示小時,可以是從0到23之間的任何整數。
day:表示日期,可以是從1到31之間的任何整數。
month:表示月份,可以是從1到12之間的任何整數。
week:表示星期幾,可以是從0到7之間的任何整數,這裏的0或7代表星期日。
command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。
在以上各個字段中,還可以使用以下特殊字符:
星號(*):代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件後每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”
中槓(-):可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執行一次。
crontab文件舉例
0 */5 * * * /usr/local/apache2/apachectl restart
表示每隔5個小時重啓apache服務一次。
10 1 * * 6 /webdata/bin/backup.sh
表示每週六的1點10分執行/webdata/bin/backup.sh腳本的操作。
0 0 5,25 * * fsck /dev/sdb8
表示每個月的5號和25號檢查/dev/sdb8磁盤設備。
10 5 */5 * * echo "">/usr/local/apache2/log/access_log
表示每個月的5號、10號、15號、20號、25號、30號的5點10分執行清理apache日誌操作。
crond 注意事項:
1.注意環境變量
指定crontab文件中指定任務運行所需的所有環境變量。腳本需要shell環境的支持。
2.注意清理系統用戶的郵件日誌
任務調度執行後,系統將輸出信息通過電子郵件形式發送給當前系統用戶。
這裏可以通過重定向忽略日誌信息。
> /dev/null 2>&1 (將正確的信息和錯誤的信息都重定向輸出給/dev/null)
3.系統級任務和用戶級別的任務調度
由於權限不同。一般需要root權限的調度需要指定root通過 crontab -uroot -e
或crontab -e 直接寫入。如果把一個系統級別的調度放入用戶下將不生效。
關閉進程:(kill 終止一個進程)kill的本質:就是將指定的信號送至程序。
語法: kill [信號類型] 進程 PID
查看系統所有的信號名稱:
kill -l| awk '{print $1$2,$3$4,$5$6,$7$8,$9$10}'|sed 's/ /\n/g'|grep -v "^$
只有第9種信號(SIGKILL)纔可以無條件終止進程,其他信號進程都有權利忽略,下面是常用的信號:
HUP 1 終端斷線
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
KILL 9 強制終止
用來立即結束程序的運行. 本信號不能被阻塞、處理和忽略。如果管理員發現某個進程終止不了,可嘗試發送這個信號。
TERM 15 終止 shell的默認類型
程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們纔會嘗試SIGKILL。
CONT 18 繼續(與STOP相反)
STOP 19 暫停(同 Ctrl + Z)
一般我們用到 ctrl + C 相當於給進程發送 kill -2 進程PID
ctrl + Z 相當於給進程發送 kill -19 進程PID
kill -9 進程PID
killall 進程名稱
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.