Linux環境下程序和計劃任務管理
程式時儲存在外部儲存介質(如硬碟)中的可執行機器程式碼和資料的靜態集合,而程序實在CPU及記憶體中處於動態執行狀態的計算機程式。在Linux系統中,每個程式啟動後可以建立一個或多個程序。
1
ps命令——檢視靜態的程序統計資訊
ps命令是Linux系統中最為常用的程序檢視工具,主要用於顯示包含當前執行的各進行完整資訊的靜態快照。通過不同的命令選項,可以選擇性的檢視程序資訊。
-
a:顯示當前終端下的所有程序資訊,包括其他使用者的程序。與“x”選項結合時將顯示系統中所有的程序資訊。
-
u:使用以使用者為主的格式輸出程序資訊。
-
x:顯示當前使用者在所有終端下的程序資訊。
-
-e:顯示系統內的所有程序資訊。
-
-l:使用長格式顯示程序資訊。
-
-f:使用完整的格式顯示程序資訊。
執行“ps aux”命令後,將以簡單列表的形式顯示出程序資訊。
下述輸出資訊中,第1行為列表標題,其中各欄位的含義描述如下:
USER:啟動該程序的使用者賬號的名稱。
PID:該程序在系統中的數字ID號,在當前系統中是唯一的。
%CPU:CPU佔用的百分比。
%MEM:記憶體佔用的百分比。
VSZ:佔用虛擬記憶體swap空間的大小。
RSS:佔用常駐記憶體實體記憶體的大小。
TTY:表明該程序在哪個終端上執行。“?”表示未知或不需要終端。
STAT:顯示了程序當前的狀態,S:休眠、R:執行、Z:僵死、<:高優先順序、N:低優先順序、s:父程序、+:前臺程序。
START:啟動該程序的時間。
TIME:該程序佔用的CPU時間。
COMMAND:啟動該程序的命令的名稱。
[[email protected] ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.1 19364 1540 ? Ss 12:19 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 12:19 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 12:19 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S 12:19 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S 12:19 0:00 [migration/0] root 6 0.0 0.0 0 0 ? S 12:19 0:00 [watchdog/0] root 7 0.0 0.0 0 0 ? S 12:19 0:00 [migration/1] root 8 0.0 0.0 0 0 ? S 12:19 0:00 [migration/1] root 9 0.0 0.0 0 0 ? S 12:19 0:00 [ksoftirqd/1] root 10 0.0 0.0 0 0 ? S 12:19 0:00 [watchdog/1] root 11 0.0 0.0 0 0 ? S 12:19 0:00 [events/0] root 12 0.0 0.0 0 0 ? S 12:19 0:00 [events/1] root 13 0.0 0.0 0 0 ? S 12:19 0:00 [cgroup] root 14 0.0 0.0 0 0 ? S 12:19 0:00 [khelper] root 15 0.0 0.0 0 0 ? S 12:19 0:00 [netns] root 16 0.0 0.0 0 0 ? S 12:19 0:00 [async/mgr] root 17 0.0 0.0 0 0 ? S 12:19 0:00 [pm] root 18 0.0 0.0 0 0 ? S 12:19 0:00 [sync_supers] root 19 0.0 0.0 0 0 ? S 12:19 0:00 [bdi-default] root 20 0.0 0.0 0 0 ? S 12:19 0:00 [kintegrityd/0] root 21 0.0 0.0 0 0 ? S 12:19 0:00 [kintegrityd/1]
若執行“ps -elf”命令,則將以長格式顯示系統中的程序資訊,並且顯示內容較多。輸出資訊中還包括PPID列(表示對應程序的父程序的PID號)。
[[email protected] ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 4841 poll_s 12:19 ? 00:00:01 /sbin/init
1 S root 2 0 0 80 0 - 0 kthrea 12:19 ? 00:00:00 [kthreadd]
1 S root 3 2 0 -40 - - 0 migrat 12:19 ? 00:00:00 [migration/0]
1 S root 4 2 0 80 0 - 0 ksofti 12:19 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 -40 - - 0 cpu_st 12:19 ? 00:00:00 [migration/0]
5 S root 6 2 0 -40 - - 0 watchd 12:19 ? 00:00:00 [watchdog/0]
1 S root 7 2 0 -40 - - 0 migrat 12:19 ? 00:00:00 [migration/1]
1 S root 8 2 0 -40 - - 0 cpu_st 12:19 ? 00:00:00 [migration/1]
1 S root 9 2 0 80 0 - 0 ksofti 12:19 ? 00:00:00 [ksoftirqd/1]
5 S root 10 2 0 -40 - - 0 watchd 12:19 ? 00:00:00 [watchdog/1]
直接執行不帶任何選項的ps命令時,將只顯示當前使用者會話中開啟的程序。
[[email protected] ~]# ps
PID TTY TIME CMD
2258 pts/1 00:00:00 bash
2280 pts/1 00:00:00 bash
2369 pts/1 00:00:00 ps
由於系統中執行的程序數量較多。需要查詢某一個程序的資訊時可以結合管道操作和grep命令進行過濾。
[[email protected] ~]# ps aux | grep bash
root 2239 0.0 0.1 108336 1772 pts/0 Ss+ 12:22 0:00 /bin/bash
root 2258 0.0 0.1 108336 1812 pts/1 Ss 12:23 0:00 -bash
root 2280 0.0 0.1 108336 1764 pts/1 S 12:23 0:00 bash
root 2753 0.0 0.0 103256 848 pts/1 S+ 13:41 0:00 grep bash
2
top命令——檢視程序動態資訊
top命令將會在當前終端以全屏互動式的介面顯示程序排名,及時跟蹤包括CPU、記憶體等系統資源佔用情況,預設情況下每三秒重新整理一次。
上述輸出資訊中,開頭的部分顯示了系統任務Tasks、CPU佔用、記憶體佔用Mem、交換空間Swap等資訊,下方將依次顯示當前程序的排名情況。
-
系統任務Tasks資訊:total:總程序數;running:正在執行的程序數;sleeping:休眠的程序數;stopped:中止的程序數;zomibe:僵死無響應的程序數。
-
CPU佔用資訊:us:使用者佔用;sy:核心佔用;ni:優先順序排程佔用;id:空閒CPU;wa:I/O等待佔用;hi:硬體中斷佔用;si:軟體中斷佔用;st:虛擬化佔用。Rt:實時變化。
-
記憶體佔用Mem資訊:total,總記憶體空間;used,已用記憶體;free,空閒記憶體;buffers,緩衝區域。
-
交換空間swap佔用:total,總交換空間;used,已用交換空間;free,空閒交換空間;cached,快取空間。
在top命令的全屏操作介面中,可以按P鍵根據CPU佔用情況對程序列表進行排序,或按M鍵根據記憶體佔用情況進行排序,按N鍵根據啟動時間進行排序,按h鍵可以獲得top程式的線上幫助資訊,按q鍵可以正常退出top程式。
3
pgrep命令——查詢程序資訊
pgrep命令正是用來查詢特定程序資訊的專用工具。使用pgrep命令可以根據程序的名稱、執行該程序的使用者、程序所在的終端等多種屬性查詢特定程序的PID號。
通過pgrep命令,可以只指定程序的一部分名稱進行查詢,結合“-l”選項可同時輸出對應的程序名、“-U”選項查詢特定使用者的程序、“-t”選項查詢在特定終端執行的程序。
[[email protected] ~]# pgrep -l "log"
1180 rsyslogd
4
pstree命令——查詢程序樹
pstree命令可以輸出Linux系統中各程序的樹形結構,判斷出各程序之間的相互關係(父、子程序)。pstree命令預設情況下只顯示各程序的名稱,“-p”選項使用時可以同時列出對應的PID號、“-u”選項可以列出對應的使用者名稱、“-a”選項可以列出完整的命令資訊。
執行“pstree -aup”命令可以檢視當前系統的程序樹,包括各程序對應的PID號、使用者名稱、完整命令等資訊。
[[email protected] ~]# pstree -aup
init,1
├─NetworkManager,1249 --pid-file=/var/run/NetworkManager/NetworkManager.pid
│ ├─dhclient,2909 -d -4 -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-eth1.pid -lf...
│ └─{NetworkManager},1300
├─abrtd,1570
├─acpid,1328
├─atd,1589
├─auditd,1155
│ └─{auditd},1156
├─automount,1411 --pid-file /var/run/autofs.pid
│ ├─{automount},1412
│ ├─{automount},1413
│ ├─{automount},1417
│ └─{automount},1420
├─bonobo-activati,1945 --ac-activate --ior-output-fd=18
│ └─{bonobo-activat},1946
├─certmonger,1601 -S -p /var/run/certmonger.pid
├─clock-applet,2192 --oaf-activate-iid=OAFIID:GNOME_ClockApplet_Factory --oaf-ior-fd=34
├─console-kit-dae,1672 --no-daemon
│ ├─{console-kit-da},1673
│ ├─{console-kit-da},1674
│ ├─{console-kit-da},1675
│ ├─{console-kit-da},1676
5
at一次性任務設定
at命令設定的計劃任務只在指定的時間點執行一次,前提是對應的系統服務atd必須已經執行。需要注意的是,計劃執行任務的時間、日期必須安排在當前系統的時刻之後,否則將無法正確設定計劃任務。
設定一次性計劃任務時,在at命令列中依次指定計劃執行任務的時間、日期作為引數(若只指定時間則表示當天的該時間,若只指定日期則表示該日期的當前時間),確認後將進入帶“at>”提示符的任務編輯介面,每行設定一條執行命令,可以依次設定多條語句,最後按Ctrl+D組合鍵提交任務即可。所設定的命令操作將在計劃的時間點被依次執行。
[[email protected] ~]# date
2016年 06月 17日 星期五 15:01:40 CST
[[email protected] ~]# at 15:05 2016-06-17
at> cat /proc/cpuinfo > /tmp/ps.root
at> <EOT>
job 2 at 2016-06-17 15:05
[[email protected] ~]# cat /tmp/ps.root
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 61
model name : Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz
stepping : 4
cpu MHz : 2194.915
cache size : 3072 KB
fpu : yes
fpu_exception : yes
cpuid level : 20
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon xtopology tsc_reliable nonstop_tsc unfair_spinlock pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch arat fsgsbase smep
bogomips : 4389.83
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 61
model name : Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz
stepping : 4
cpu MHz : 2194.915
cache size : 3072 KB
fpu : yes
fpu_exception : yes
cpuid level : 20
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon xtopology tsc_reliable nonstop_tsc unfair_spinlock pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch arat fsgsbase smep
bogomips : 4389.83
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
You have mail in /var/spool/mail/root
[[email protected] ~]#
在當天的15:10時自動關閉當前系統。
[[email protected] ~]# at 15:10
at> cat /proc/cpuinfo
at> <EOT>
job 3 at 2016-06-17 15:10
[[email protected] ~]#
對於已經設定但還未執行的計劃任務,可以通過atq命令進行查詢。
[[email protected] ~]# atq
3 2016-06-17 15:10 a root
[[email protected] ~]#
若要刪除指定編號的at任務,可以執行atrm命令。刪除後的at任務將不會被執行,並且不會顯示在atq命令的顯示結果中。但已經執行過的任務無法刪除。
[[email protected] ~]# at 15:16
at> cat /proc/cpuinfo
at> <EOT>
job 4 at 2016-06-17 15:16
[[email protected] ~]# atrm 4
[[email protected] ~]# atq
[[email protected] ~]#
6
crontab週期性任務設定
使用crontab命令設定的計劃任務可以按預設的週期重複執行,可以大大減輕設定重複性系統管理任務的操作。啟用週期性任務也有一個的前提條件,即對應的系統服務crond必須已經執行。
crontab的配置檔案和目錄
crond通過多個目錄和檔案設定計劃任務,不同型別的任務由不同的配置檔案來設定。
/etc/crontab檔案中設定的是維護Linux系統所需的任務,由Linux系統及相關程式在安裝時自動設定,不建議使用者手動修改此檔案。該檔案包括了設定shell環境、可執行路徑等變數的操作,以及每小時、每天、每週、每月需要執行的任務目錄。
[[email protected] ~]# cat /etc/crontab
SHELL=/bin/bash 設定執行計劃任務的shell環境
PATH=/sbin:/bin:/usr/sbin:/usr/bin 定義可執行命令及程式的路徑
MAILTO=root 將任務輸出資訊傳送到指定使用者的郵箱
HOME=/ 執行計劃任務時使用的主目錄
# For details see man 4 crontabs
# 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
[[email protected] ~]#
/var/spool/cron——使用者cron任務的配置檔案存放目錄
由使用者自行設定的cron計劃任務將被儲存到目錄/var/spool/cron/中,檔名與使用者名稱相同。
[[email protected] ~]# ls -l /var/spool/cron/
總用量 0
[[email protected] ~]#
crond守護程序會自動檢查/etc/crontab檔案、/etc/cron.d/目錄及/var/spool/cron目錄中的改變,如果發現有配置更改,就會被載入記憶體,所以當某個crontab檔案改變後並不需要重新啟動crond守護程序就可以使設定生效。
使用crontab命令管理使用者的計劃任務
設定使用者的週期性計劃任務列表主要通過crontab命令進行,結合不同的選項可以完成不同的計劃任務管理操作。
-e:編輯計劃任務列表。
-u:指定所管理的計劃任務屬於哪個使用者,預設時針對當前使用者,一般只有root使用者有許可權使用此選項使用者編輯、刪除其他使用者的計劃任務。
-l:列表顯示計劃任務。
-r:刪除計劃任務列表。
當使用“*”時表示取值範圍中的任意時間。crontab任務配置記錄中所設定的命令操作將在“分鐘”+“小時”+“日期”+“月份”+“星期”都滿足的條件下執行。
crontab計劃任務的配置格式 | |||||
分鐘 | 小時 | 日期 | 月份 | 星期 | 執行的命令 |
01 | * | * | * | * | service httpd start |
02 | 4 | * | * | * | service httpd stop |
除了“*”以外,還可以用減號“-”、逗號“,”、斜槓“/”與數字構成表示式來表示較複雜的時間關係。
“-”:表示一個連續的時間範圍
“,”:表示一個間隔的不連續範圍
“/”:表示指定間隔頻率,例如*/5表示每隔五天。
crontab計劃任務的配置欄位說明 | ||||
專案 | 說明 | |||
分鐘 | 取值從0~59的任意整數 | |||
小時 | 取值從0~23的任意整數 | |||
日期 | 取值從1~31的任意整數(日期在該月份中必須有效) | |||
月份 | 取值從1~12的任意整數 | |||
星期 | 取值從0~7的任意整數,0或7代表星期日 | |||
命令 | 可以是普通的命令,也可以是編寫的指令碼 |
“crontab -e”命令:可以設定自己的計劃任務。
[[email protected] ~]# crontab -e
01 * * * * /sbin/service httpd start
02 * * * * /sbin/service httpd stop
“crontab -l”命令:可以檢視當前使用者的計劃任務列表。(-u:可以檢視其它使用者的計劃任務)
[[email protected] ~]# crontab -l
01 * * * * /sbin/service httpd start
02 * * * * /sbin/service httpd stop
[[email protected] ~]#
“crontab -r”命令:可以刪除使用者的計劃任務列表。
[[email protected] ~]# crontab -r
[[email protected] ~]# crontab -l
no crontab for root
[[email protected] ~]#