1. 程式人生 > >Linux系統管理——進程和計劃任務

Linux系統管理——進程和計劃任務

iowait pri 發送郵件 個數 屬性 str 檢查 輕量 etc

1、進程


進程的管理是內核的重要功能之一,了解和熟練的完成進程管理是系統安全、性能效率優化的基礎。


1.1、進程的性能及功能

    內核的功用:    
        進程管理、文件系統、網絡功能、內存管理、驅動程序、 安
        全功能等。


進程的性質:

    Process:     
        運行中的程序的一個副本,是被載入內存的一個指令集合進程ID(Process ID,PID)號碼被用來標記各個進程
        UID、 GID、和SELinux語境決定對文件系統的存取和訪問權限;
    
        通常從執行進程的用戶來繼承;
        存在生命周期。



1.2、進程的創建

    進程創建:
        init:第一個進程;上帝進程。
        進程之間存在父子關系。
    
    進程:
        都由其父進程創建,CoW(寫時復制);
        fork(), clone()



1.3、進程的基本狀態與切換

技術分享圖片


進程的基本狀態:

    創建狀態:    
        進程在創建時需要申請一個空白PCB(process
        control block進程控制塊),向其中填寫控制和管理進程的信
        息,完成資源分配。如果創建工作無法完成,比如資源無法滿
        足,就無法被調度運行,把此時進程所處狀態稱為創建狀態;
    
    就緒狀態:
        進程已經準備好,已分配到所需資源,只要分配到
        CPU就能夠立即運行;
    
    執行狀態:進程處於就緒狀態被調度後,進程進入執行狀態;
    
    阻塞狀態:
        正在執行的進程由於某些事件(I/O請求,申請緩
        存區失敗)而暫時無法運行,進程受到阻塞。在滿足請求時進
        入就緒狀態等待系統調用;
    
    終止狀態:
        進程結束,或出現錯誤,或被系統終止,進入終止
        狀態。無法再執行;



1.4、進程優先級

    系統優先級:
        數字越小,優先級越高;
        0-139(CentOS4,5):各有140個運行隊列和過期隊列;
        0-98,99(CentOS6);
    實時優先級: 99-0 值最大優先級最高;
    nice值:-20到19,對應系統優先級100-139或99;
    
    Big O:時間復雜度,用時和規模的關系
    O(1), O(logn), O(n)線性, O(n^2)拋物線, O(2^n)


2、系統管理工具


Linux系統狀態的查看及管理工具:
    pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat, dstat, kill,
    pkill, job, bg, fg, nohup


2.1、pstree命令


pstree - display a tree of processes

[root@rootdns ~]$pstree
init─┬─abrtd
     ├─acpid
     ├─atd
     ├─auditd───{auditd}
     
[root@rootdns ~]$pstree -p
init(1)─┬─abrtd(2237)
        ├─acpid(1698)
        ├─atd(2279)
        ├─auditd(1586)───{auditd}(1587)
        ├─console-kit-dae(2310)─┬─{console-kit-da}(2311)
        │                       ├─{console-kit-da}(2312)

2.2、ps命令


ps: process state;
ps - report a snapshot of the current processes;


Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中;
ps [OPTION]...
    支持三種選項:
        UNIX選項 如-A -e
        BSD選項 如a
        GNU選項 如--help


常用選項:

選項:默認顯示當前終端中的進程    
    ? a 選項包括所有終端中的進程
    ? x 選項包括不鏈接終端的進程
    ? u 選項顯示進程所有者的信息
    ? f 選項顯示進程樹,相當於 --forest
    ? k|--sort 屬性 對屬性排序,屬性前加- 表示倒序
    ? o 屬性… 選項顯示定制的信息 pid、 cmd、 %cpu、 %mem
    ? L 顯示支持的屬性列表
    -C cmdlist     指定命令,多個命令用,分隔
    -L 顯示線程
    -e: 顯示所有進程,相當於-A
    -f: 顯示完整格式程序信息
    -F: 顯示更完整格式的進程信息
    -H: 以進程層級格式顯示進程相關信息
    -u userlist 指定有效的用戶ID或名稱
    -U userlist 指定真正的用戶ID或名稱
    -g gid或groupname 指定有效的gid或組名稱
    -G gid或groupname 指定真正的gid或組名稱
    -p pid 顯示指pid的進程
    --ppid pid 顯示屬於pid的子進程
    -M 顯示SELinux信息,相當於Z

輸出屬性:

        VSZ: Virtual memory SiZe    ,虛擬內存集,線性內存
        RSS: ReSident Size, 常駐內存集
        STAT:進程狀態
            R:running
            S: interruptable sleeping
            D: uninterruptable sleeping
            T: stopped
            Z: zombie
            +: 前臺進程
            l: 多線程進程
            L:內存分頁並帶鎖
            N:低優先級進程
            <: 高優先級進程
            s: session leader,會話(子進程)發起者
        ni: nice值
        pri: priority 優先級
        psr: processor CPU編號
        rtprio: 實時優先級
示例:
    ps axo pid,cmd,psr,ni,pri,rtprio
常用組合:
    aux
    -ef
    -eFH
    -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
    axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm


2.2.1、示例

查詢你擁有的所有進程:
ps -x
顯示指定用戶名(RUID)或用戶ID的進程:
ps -fU apache
ps -fu 48
顯示指定用戶名(EUID)或用戶ID的進程:
ps -fu wang
ps -fu 1000
查看以root用戶權限(實際和有效ID)運行的每個進程:
ps -U root -u root
列出某個組擁有的所有進程(實際組ID:RGID或名稱):
ps -fG nginx

列出有效組名稱(或會話)所擁有的所有進程:
ps -fg mysql
ps -fG 27
通過進程ID來顯示所屬的進程:
ps -fp 1234
以父進程ID來顯示其下所有的進程,如顯示父進程為1154的
所有進程:
ps -f --ppid 1234
顯示指定PID的多個進程:
ps -fp 1204,1239,1263
要按tty顯示所屬進程:
ps -ft pst/0

以進程樹顯示系統中的進程如何相互鏈接:
ps -e --forest
以進程樹顯示指定的進程
ps -f --forest -C sshd
ps -ef --forest | grep -v grep | grep sshd
要顯示一個進程的所有線程,將顯示LWP(輕量級進程)以及
NLWP(輕量級進程數)列:
ps -fL -C nginx
要列出所有格式說明符:
ps L
查看進程的PID,PPID,用戶名和命令:
ps -eo pid,ppid,user,cmd

自定義格式顯示文件系統組,ni值開始時間和進程的時間:
ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
使用其PID查找進程名稱:
ps -p 1244 -o comm=
要以其名稱選擇特定進程,顯示其所有子進程
ps -C sshd,bash
查找指定進程名所有的所屬PID,在編寫需要從std輸出或文
件讀取PID的腳本時這個參數很有用:
ps -C httpd,sshd -o pid=
檢查一個進程的執行時間
ps -eo comm,etime,user | grep nginx


查找占用最多內存和CPU的進程:
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem |
head
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
顯示安全信息:
ps -eM
ps --context
使用以下命令以用戶定義的格式顯示安全信息。
ps -eo euser,ruser,suser,fuser,f,comm,label
使用watch實用程序執行重復的輸出以實現對就程進行實時的
監視,如下面的命令顯示每秒鐘的監視:
watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-
%mem | head'


2.2.2、進程優先級

進程優先級調整:
    靜態優先級:100-139
    進程默認啟動時的nice值為0,優先級為120
    只有根用戶才能降低nice值(提高優先性)
nice命令:
    nice [OPTION] [COMMAND [ARG]...]
renice命令:
    renice [-n] priority pid...
查看:
    ps axo pid,comm,ni


2.2.3、搜索進程

最靈活:ps 選項 | 其它命令
按預定義的模式:pgrep
    pgrep [options] pattern
    -u uid: effective user,生效者
    -U uid: real user,真正發起運行命令者
    -t terminal: 與指定終端相關的進程
    -l: 顯示進程名
    -a: 顯示完整格式的進程名
    -P pid: 顯示指定進程的子進程
按確切的程序名稱:/sbin/pidof
    pidof bash



2.3、系統工具uptime

顯示當前時間,系統已啟動的時間、當前上線人數,系統平
均負載(1、 5、 10分鐘的平均負載,一般不會超過1)
系統平均負載:
    指在特定時間間隔內運行隊列中的平均進程數;

通常每個CPU內核的當前活動進程數不大於3,那麽系統
的性能良好。 如果每個CPU內核的任務數大於5,那麽此
主機的性能有嚴重問題;

如果linux主機是1個雙核CPU,當Load Average 為6的
時候說明機器已經被充分使用;
[root@rootdns ~]$uptime
 14:30:06 up  4:32,  3 users,  load average: 0.00, 0.00, 0.00


2.4、進程管理工具top


top:有許多內置命令:
    排序:
        P:以占據的CPU百分比,%CPU
        M:占據內存百分比,%MEM
        T:累積占據CPU時長,TIME+
    首部信息顯示:
        uptime信息:l命令
        tasks及cpu信息:t命令
        cpu分別顯示:1 (數字)
        memory信息:m命令
    退出命令:q
    修改刷新時間間隔:s
    終止指定進程:k
    保存文件:W
    欄位信息簡介    
        us:用戶空間
        sy:內核空間
        ni:調整nice時間
        id:空閑
        wa:等待IO時間
        hi:硬中斷
        si:軟中斷(模式切換)
        st:虛擬機偷走的時間
選項:
    -d #: 指定刷新時間間隔,默認為3秒
    -b: 全部顯示所有進程
    -n #: 刷新多少次後退出
[root@rootdns ~]$top
top - 14:30:37 up  4:32,  3 users,  load average: 0.00, 0.00, 0.00
Tasks: 157 total,   1 running, 156 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.1%sy,  0.0%ni, 99.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004112k total,   597308k used,   406804k free,    88384k buffers
Swap:  1048572k total,        0k used,  1048572k free,   206356k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                    
  2107 mysql     20   0  988m 161m 5384 S  0.3 16.5   0:16.95 mysqld                                      
  3210 root      20   0 15036 1272  944 R  0.3  0.1   0:00.01 top                                         
     1 root      20   0 19348 1556 1236 S  0.0  0.2   0:01.52 init
擴展:
    htop命令:EPEL源
    選項:
        -d #: 指定延遲時間;
        -u UserName: 僅顯示指定用戶的進程
        -s COLUME: 以指定字段進行排序
    子命令:
        s: 跟蹤選定進程的系統調用
        l: 顯示選定進程打開的文件列表
        a:將選定的進程綁定至某指定CPU核心
        t: 顯示進程樹


2.5、vmstat命令


虛擬內存信息
vmstat [options] [delay [count]]
vmstat 2 5
procs:
    r:可運行(正運行或等待運行)進程的個數,和核心數有關
    b:處於不可中斷睡眠態的進程個數(被阻塞的隊列的長度)
memory:
    swpd: 交換內存的使用總量
    free:空閑物理內存總量
    buffer:用於buffer的內存總量
    cache:用於cache的內存總量
swap:
    si:從磁盤交換進內存的數據速率(kb/s)
    so:從內存交換至磁盤的數據速率(kb/s)
io:
    bi:從塊設備讀入數據到系統的速率(kb/s)
    bo: 保存數據至塊設備的速率
system:
    in: interrupts 中斷速率,包括時鐘
    cs: context switch 進程切換速率
cpu:
    us:Time spent running non-kernel code
    sy: Time spent running kernel code
    id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
    wa: Time spent waiting for IO. 2.5.41前,包括in idle.
    st: Time stolen from a virtual machine. 2.6.11前, unknown.
選項:
    -s: 顯示內存的統計數據
[root@rootdns ~]$vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 406804  88384 206392    0    0     4     1   10   14  0  0 100  0  0	
[root@rootdns ~]$vmstat -s
      1004112  total memory
       595632  used memory
       336248  active memory
       147916  inactive memory
       408480  free memory
        88384  buffer memory
       206428  swap cache
      1048572  total swap



2.6、iostat命令


iostat:統計CPU和設備IO信息

示例:iostat 1 10



[root@rootdns ~]$iostat
Linux 2.6.32-696.el6.x86_64 (rootdns) 	01/21/2018 	_x86_64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.06    0.17    0.00   99.76

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.66        29.84         9.79     536260     175890
scd0              0.01         0.64         0.00      11488          0
dm-0              0.06         0.96         0.05      17298        848



2.7、pmap命令

    pmap命令:進程對應的內存映射;
    
    pmap [options] pid [...]
    -x: 顯示詳細格式的信息
    示例:pmap 1
    
    另外一種實現:
    cat /proc/PID/maps
[root@rootdns ~]$pmap 1797
1797:   /usr/sbin/sshd
00007f286e56c000     52K r-x--  /lib64/libnss_files-2.12.so
00007f286e579000   2044K -----  /lib64/libnss_files-2.12.so
00007f286e778000      4K r----  /lib64/libnss_files-2.12.so
00007f286e779000      4K rw---  /lib64/libnss_files-2.12.so
00007f286e77a000     28K r-x--  /lib64/librt-2.12.so
00007f286e781000   2044K -----  /lib64/librt-2.12.so
[root@rootdns ~]$pmap -x  1797
1797:   /usr/sbin/sshd
Address           Kbytes     RSS   Dirty Mode   Mapping
00007f286e56c000      52       0       0 r-x--  libnss_files-2.12.so
00007f286e579000    2044       0       0 -----  libnss_files-2.12.so
00007f286e778000       4       4       4 r----  libnss_files-2.12.so
00007f286e779000       4       4       4 rw---  libnss_files-2.12.so
00007f286e77a000      28       0       0 r-x--  librt-2.12.so
00007f286e781000    2044       0       0 -----  librt-2.12.so



2.8、glances命令


EPEL源

glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-Ppassword] [--password] [-t refresh] [-f file] [-o output]
內建命令:
    a Sort processes automatically     l Show/hide logs
    c Sort processes by CPU%           b Bytes or bits for network I/O
    m Sort processes by MEM%           w Delete warning logs
    p Sort processes by name           x Delete warning and critical logs
    i Sort processes by I/O rate       1 Global CPU or per-CPU stats
    d Show/hide disk I/O stats         h Show/hide this help screen
    f Show/hide file system stats      t View network I/O as combination
    n Show/hide network stats          u View cumulative network I/O
    s Show/hide sensors stats          q Quit (Esc and Ctrl-C also work)
    y Show/hide hddtemp stats
常用選項:
    -b: 以Byte為單位顯示網卡數據速率
    -d: 關閉磁盤I/O模塊
    -f /path/to/somefile: 設定輸入文件位置
    -o {HTML|CSV}:輸出格式
    -m: 禁用mount模塊
    -n: 禁用網絡模塊
    -t #: 延遲時間間隔
    -1:每個CPU的相關數據單獨顯示
C/S模式下運行glances命令

    服務器模式:
    glances -s -B IPADDR
    IPADDR: 指明監聽的本機哪個地址
    
    客戶端模式:
    glances -c IPADDR
    IPADDR:要連入的服務器端地址


2.9、dstat命令

:系統資源統計,代替vmstat,iostat
dstat [-afv] [options..] [delay [count]]

    -c: 顯示cpu相關信息
    -C #,#,...,total
    -d: 顯示disk相關信息
    -D total,sda,sdb,...
    -g:顯示page相關統計數據
    -m: 顯示memory相關統計數據
    -n: 顯示network相關統計數據
    -p: 顯示process相關統計數據
    -r: 顯示io請求相關的統計數據
    -s: 顯示swapped相關的統計數據
    --tcp
    --udp
    --unix
    --raw
    --socket
    --ipc
    --top-cpu:顯示最占用CPU的進程
    --top-io: 顯示最占用io的進程
    --top-mem: 顯示最占用內存的進程
    --top-latency: 顯示延遲最大的進程



2.10、iotop


iotop命令是一個用來監視磁盤I/O使用狀況的top類工具。
iotop具有與top相似的UI,其中包括PID、用戶、 I/O、進程
等相關信息。可查看每個進程是如何使用IO

交互按鍵:
    left和right方向鍵:改變排序
    r:反向排序
    o:切換至選項--only
    p:切換至--processes選項
    a:切換至--accumulated選項
    q:退出。
    i:改變線程的優先級
[root@rootdns ~]$iotop
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                    
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    4 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [stopper/0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]
    7 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/1]
    8 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [stopper/1]
    9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/1]
   10 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/1]



2.11、kill命令

    向進程發送控制信號,以實現對進程管理,每個信號對應一個數字,    
    信號名稱以SIG開頭(可省略),不區分大小寫;
    
    顯示當前系統可用信號: kill –l,trap -l
    常用信號:man 7 signal
[root@rootdns ~]$kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	
指定信號的方法:
    (1) 信號的數字標識:1, 2, 9
    (2) 信號完整名稱:SIGHUP (3) 信號的簡寫名稱:HUP
按PID:
    kill [-SIGNAL] pid …
    kill –n SIGNAL pid;kill –s SIGNAL pid

按名稱:killall [-SIGNAL] comm…

按模式:pkill [options] pattern
    -SIGNAL
    -u uid: effective user,生效者
    -U uid: real user,真正發起運行命令者
    -t terminal: 與指定終端相關的進程
    -l: 顯示進程名(pgrep可用)
    -a: 顯示完整格式的進程名(pgrep可用)
    -P pid: 顯示指定進程的子進程




3、任務計劃

    Linux任務計劃、周期性任務執行未來的某時間點執行一次任務;
    
    at:一次性任務計劃;
    batch:系統自行選擇空閑時間去執行此處指定的任務周期性運行某任務;
    cron:系統計劃任務,或者用戶任務計劃;



3.1、at

包:at
? at命令:at [option] TIME
? 常用選項:
-V 顯示版本信息:
-l: 列出指定隊列中等待運行的作業;相當於atq
-d: 刪除指定的作業;相當於atrm
-c: 查看具體作業任務
-f /path/from/somefile:從指定的文件中讀取任務
-m:當任務被完成之後,將給用戶發送郵件,即使沒有標準輸出
註意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶


執行方式:
    1)交互式 2)輸入重定向 3)at –f 文件
依賴與atd服務,需要啟動才能實現at任務;at隊列存放在/var/spool/at目錄中
/etc/at.{allow,deny}控制用戶是否能執行at任務:

    白名單:/etc/at.allow 默認不存在,只有該文件中的用戶
    才能執行at命令;
    
    黑名單:/etc/at.deny 默認存在,拒絕該文件中用戶執行
    at命令,而沒有在at.deny 文件中的使用者則可執行;
    
    如果兩個文件都不存在,只有 root 可以執行 at 命令


3.2、cron


周期性任務計劃:cron
相關的程序包:

    cronie: 主程序包,提供crond守護進程及相關輔助工具;
    cronie-anacron:
        cronie的補充程序,用於監控cronie任務執行狀況,
        如cronie中的任務在過去該運行的時間點未能正常
        運行,則anacron會隨後啟動一次此任務;
        
    crontabs:包含CentOS提供系統維護任務
確保crond守護處於運行狀態:
    CentOS 7:
    systemctl status crond
    CentOS 6:
    service crond status
    
計劃周期性執行的任務提交給crond,到指定時間會自動運行
系統cron任務:系統維護作業
    /etc/crontab

用戶cron任務:
    crontab命令

日誌:/var/log/cron
詳情參見 man 5 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

例如:晚上9點10分運行echo命令
10 21 * * * centos /bin/echo "Howdy!"

@reboot Run once after reboot.
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
系統的計劃任務:
    /etc/crontab
    /etc/cron.d/ 配置文件
    /etc/cron.hourly/ 腳本
    /etc/cron.daily/ 腳本
    /etc/cron.weekly/ 腳本
    /etc/cron.monthly/腳本








Linux系統管理——進程和計劃任務