1. 程式人生 > >Linux環境下程序和計劃任務管理

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] ~]#