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
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 程序名稱
本文轉自 swallow_zys 51CTO部落格,原文連結:http://blog.51cto.com/12042068/1898730,如需轉載請自行聯系原作者