Linux系統管理——進程和計劃任務
阿新 • • 發佈:2018-01-31
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系統管理——進程和計劃任務