1. 程式人生 > >進程管理及計劃任務

進程管理及計劃任務

方法 filename bin png 完整 統計數據 ade 計劃任務 小時

進程的概念:

  • 內核的功用:進程管理,文件系統,網絡功能,內存管理, 驅動程序,等
  • process:運行中的程序的一個副本,是被載入內存的一個指令集合
  • 進程ID(process ID,PID)號碼被用來標記各個進程,UID, GID和SELinux語境決定對文件系統的存取和訪問權限.通常從執行進程的用戶來繼承
  • 在Centos6以前第一個進程init
  • Centos7是systemd 為父子關系
  • 進程:都是由其父進程創建,使用cow機制,(寫時復制)
  • 在沒有寫之前父子功用同一個空間,之後子進程單獨指向其復制空間
  • 進程優先級
  • 系統優先級:數字越小優先級越高 (0-99)
  • 實時(realtime)優先級:值越大優先級越高(99-0)
  • nice優先級: 值越小優先級越高 (-20-19) 相當於系統99範圍內
  • 進程相關概念
  • 進程內存:
  • page Frame:頁框,yong存儲頁面數據,存儲page 4k
  • LRU:Least Recently Used 近期最少使用算法,釋放內存
  • 進程狀態
  • Linux內核:搶占式多任務
  • 進程類型:
  • 守護進程:daemon,相當於服務進程,在系統引導過程中啟動的進程,和終端無關進程
  • 前臺進程:跟終端相關,通過終端啟動的進程 占用窗口
  • 前後臺兩者可以轉換
  • 進程狀態
  • 運行態:running
  • 就緒態:ready
  • 睡眠態: 可中斷:intrruptable
  • 不可中斷:uninterruptable
  • 停止態: stopped,暫停與內存,但不會被調用,除非手動啟動
  • 僵死態:zombie:結束進程,父進程結束前,子進程不關閉(重啟解決)

進程管理工具

  • 進程分類:
  • cpu密集型,非交互
  • IO密集型,交互
  • Linux系統狀態的查看及管理工具:
  • pstree , ps , pidof, pgrep , top , htop, glance, pamap, vmstat, dstat,
  • kill, pkill, job, bg, fg, nphup
  • Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中
  • pstree命令:
  • 列舉進程ps
  • 適用於ps在查看進程信息

  • ps [OPRION]
  • 支持三種選項:
  • UNIX選項 -A -e
  • BSD選項 A e
  • GNU選項 --help
  • 選項:
  • a :查看所有終端的進程
  • x:顯示守護進程
  • u:顯示進程所屬者信息
  • f :顯示進程的父進程
  • k|--sort 屬性 對屬性排序
  • o 屬性...選項顯示定制的信息
  • echo $$顯示當前進程
  • echo $PPID顯示父進程

進程管理工具

  • VSZ:Virtual menmory size,虛擬內存集,線性內存
  • RSS:ReSident Size, 常駐內存集
  • STAT:進程狀態
  • R:running
  • S:interruptable sleeping
  • D:uninterruptable sleeping
  • T: sropped
  • Z:zombiie
  • +:前臺進程
  • l:多線程進程
  • L:內存分頁並帶鎖
  • N:低優先級進程
  • <:高優先級進程
  • s:session leader ,會話(子進程)發起者
  • 常用組合: -ef
  • -e:顯示所有進程
  • -f:顯示完整格式程序信息
  • -eFH:
  • -F:顯示更完整格式的進程信息
  • -H:以進程層次格式顯示進程相關信息
  • 自定義:
  • ps axo pid,comm,euid,ruid,tty,psr...
  • ps axo pid,comm,euid,ruid,tty,rtprio,pri ..
  • ni:nice值
  • pri:priority 優先級
  • psr:processor CPU編號
  • rtprio: 實時有優先級
  • ps axo pid,comm,ni,psr,tty,rtprio,pri ..
  • 搜索進程
  • 但與定義的模式:pgrep
  • -u uid: 生效者
  • -U:真正執行命令者
  • -l :顯示進程的名稱
  • -t: 查看指定終端運行的進程
  • -P:顯示指定進程的進程
  • -a:顯示完整格式的進程名稱
  • 安確切的程序名稱: /sbin/pidof
  • pidof bash
  • uptime:顯示當前時間,系統已啟動的時間,當前上線人數,系統平均負載(1,5, 10分鐘的平均負載,一般不會超過1)
  • 系統平均負載:
  • 只在特定時間間隔內運行隊列中的平均進程數
  • 通常每個cpu內核到的當前活動進程數不大於3,那麽系統的性能良好.如果每個cpu內核的任務數大於5,那麽主機的性能有嚴重問題
  • 如果Linux主機是1個雙核cpu,當Load Average為6的時候說明機器已經被充分使用
  • top:實時跟蹤當前進程狀態相當於windows任務管理器

內存工具

  • iostat:統計cpu和設備Io信息
  • iostat 1 10
  • pmap命令:進程對應的內存映射
  • -x :顯示詳細格式的信息
  • pmap 1
  • 另一種實現:
  • cat /proc/PID/maps
  • 系統監控工具
  • dstat命令:系統資源統計,代替vmstat,iostat
  • -c:顯示cpu相關信息
  • -d:顯示disk相關信息
  • -g:顯示page相關統計數據
  • -m:顯示memory相關統計數據
  • -n:顯示network相關統計數據
  • -p:顯示process相關統計數據
  • -r:顯示io請求相關的統計數據
  • -s:顯示seapped相關的統計數據
  • 進程管理工具

  • kill命令:
  • 向系統發送控制進程信號,以實現對進程管理,每個信號對應一個數字,
  • 信號名稱已SIG開頭,不區分大小寫
  • 顯示當前系統可用信號:kill -l, trap -l
  • 常用信號: man 7 signal
  • 1 :無需關閉進程而讓其重讀配置文件
  • 2 :終止正在運行的進程;相當於ctrl +c
  • 3:相當於ctrl+\
  • 9:強制殺死正在運行的進程
  • 15:終止正在運行的進程
  • 18:繼續運行
  • 19:後臺休眠
  • 指定信號的方法:
  • 信號的數字標識:1 ,2 ,9
  • 信號完整名稱: SIGHUP
  • 信號的簡寫名稱:HUP
  • kill all :殺死全部
  • 示例:
  • kill -1 PIDOF
  • kill PROCESSNAME
  • 按PID :kill [-SIGNAL] pid ...
  • kill -n SIGNAL pid
  • 按名稱:killall [-SIGNAL] comm
  • 按模式:pkill [option] pattern
  • -SIGNAL
  • -u uid:
  • pkill -9 -u user 強制殺掉指定用戶所有進程
  • -u uid: 生效者
  • -U:真正執行命令者
  • -l :顯示進程的名稱
  • -t: 查看指定終端運行的進程
  • -P:顯示指定進程的進程
  • -a:顯示完整格式的進程名稱
  • 安確切的程序名稱: /sbin/pidof
  • pidof顯示進程編號
  • process 進程
  • thread 線程
  • 在進程到的眼裏他擁有除系統以外所有內存
  • 線程可共享資源(l表示有線程)

Linux的作業控制

  • 前臺作業:通過終端啟動,且啟動後一直占據終端;
  • 後臺作業:可通過終端啟動,但啟動後即轉如後臺運行
  • 上作業運行與後臺
  • 1 運行中作業: Ctrl+z :送往後臺,作業會轉為停止狀態
  • 尚未啟動的作業:#COMMAND&
  • 作業雖然被送往後臺運行,但其依然與終端相關;退出終端,將關閉後臺作業.
  • 如果希望送往後臺,剝離與終端的關系
  • # nohup COMMAND & # screen;COMMAND
  • 查看當前終端素有作業:
  • jobs
  • 作業控制:
  • fg :把指定的後臺作業調會前臺
  • bg:讓送往後臺的作業在後臺繼續運行
  • kill 終止指定的作業

linux任務計劃,周期性任務執行

  • 未來的某時間點執行一次某任務:at.batch
  • batch:系統自行選擇空閑時間去執行此處指定的作業任務
  • 周期性運行某任務:crontab
  • 執行結果:會通過郵件發送給用戶

  • 首先確定at命令是否處於啟動狀態
  • chkconfig --list atd 查看其那些模式下處於啟動狀態
  • service atd status 查看其服務啟動狀態

at命令默認交互式

  • at [option]...TIME
  • TIME:
  • HH:MM[YYYY-mm-dd]
  • noon,正午時間 , midnight午夜時間,teatime,指下午4點
  • tomorrow +具體時間
  • 相對指定 now+#
  • UNIT:minutes hours,days,
  • at now+1min xxxx 一分鐘以後運行xxxx
  • 示例:
  • [[email protected] ~]# at noon
  • at> echo o<EOT>
  • job 8 at 2017-05-13 12:00
  • [[email protected] ~]# at now +10days
  • at> echo p
  • at> <EOT>
  • job 9 at 2017-05-22 14:35
  • 編輯額按成後ctrl +d 提交
  • [[email protected] ~]# at 13:20
  • at> touch op
  • at> <EOT>
  • at的作業有隊例,用單個字母表示,默認都是用隊列,
  • -V: 顯示版本信息
  • -l 查看 作業隊列,相當於atq
  • [[email protected] ~]# at -l
  • 3 2017-05-13 13:20 a root
  • 如果任務一執行則會消失,任務執行結果信息會通過郵件查看
  • -f:/PATH/FROM/SOMEFIE:從指定文件中讀取作業,而非交互輸入
  • cat filename | at HH:MM
  • [[email protected] ~]# echo echo dsd > job
  • [[email protected] ~]# at -f job 13:30
  • job 5 at 2017-05-13 13:30
  • [[email protected] ~]# at -l
  • 5 2017-05-13 13:30 a root
  • 4 2017-05-12 15:30 a root
  • [[email protected] ~]# cat job |at 15:38
  • job 6 at 2017-05-12 15:38

  • -m:當任務被完成後強制性給用戶發郵件
  • [[email protected] ~]# at -m 22:33
  • at> touch oo
  • -d:指明刪除作業,相當於atrm
  • [[email protected] ~]# at -l
  • 3 2017-05-13 13:20 a root
  • [[email protected] ~]# at -d 3
  • [[email protected] ~]# at -l
  • -c:查看具體作業任務
  • [[email protected] ~]# cat job |at 15:38
  • job 7 at 2017-05-12 15:38
  • [[email protected] ~]# at -c 7
  • -q:指明隊列;
  • 如果定義的任務時間相同那麽將會同事執行;
  • 註意作業執行結果是已郵件發送給提交作業的用戶,不會打印到終端.
  • 如果所設定的任務已過當前時間則會在下一次這個時間點執行
  • 重啟不會失效,因為其任務存放於"/var/spool/at"文件裏.
  • /etc/at.{allow,deny}控制用戶是否能執行at任務
  • 白名單at.allow :優先級高,由此文件,deny無效,只有此此文件中的用戶可使用at
  • 黑名單at.deny 優限級低,此文件中的用戶拒絕,不在此文件允許
  • 如果都沒有全都拒絕不包括root用

    周期性任務計劃:cron

  • 服務程序:
  • cronie:主程序包 ,提供了crond守護進程及相關輔助工具;
  • 確保crond守護進程(daemon)處於運行狀態
  • centos7 systmectl status crond.service 查看
  • centos6 service crond status
  • 向crond提交作業的方式不同於at, 他需要使用專用配置文件, 此文件固定格式,不建議使用文本編輯器直接編輯此文件;要是用crontab的命令;
  • cron任務分兩類:
  • 系統cron任務:主要用於實現系統自身的維護:
  • 手動編輯: /etc/crontab文件
  • 用戶cron任務:
  • 命令: crontab
  • 系統cron配置格式:
  • 技術分享技術分享
  • 註意:
  • 1 . 每一行定義一個周期性任務:
  • *****:定義周期性時間任務
  • username:運行任務的用戶身份
  • comanmd to be executed: 任務
  • 2 . 此處的環境變量不同於用戶登錄後獲得的環境,因此,建議命令使用絕對路徑,或者自定義PATH環境變量;
  • 示例:
  • 因為 cron 不支持特殊符號所以復雜行的任務可將其寫入腳本再加以引用
  • cp -a /etc/ /app/etcbak-`date +%s`
  • 技術分享技術分享
  • 表示每月,每周,每天,每小時,每分鐘 都備份指定任務
  • 用戶cron的配置格式: /var/spool/cron/USERNAME
  • 註意:
  • 1 . 每行定義一個corn任務,
  • 2 . 此處的環境變量不同於用戶登錄後獲得的環境,因此,建議命令使用絕對路徑,或者指定以PATH 環境變量;
  • 3 . 郵件發送給當前用戶:
  • 管理臨時文件:

  • centos6使用/etc/cron.daiy/tmpwatch定時清除臨時文件
  • centons7使用systemd-tmpfiles-setup服務實現
  • /var/log/cron 計劃任務日誌文件
  • 時間表示法:
  • 1 . 特定值:
  • 給定時間點有效取值範圍內的值;
  • 註意:day of week 和dayof moth一般不同時使用;
  • 2 . *
  • 給定時間上有效取值範圍內的所有值;表示"每..."
  • 3 . 離散取值:
  • 在時間點上使用逗號分隔的多個值;
  • #,#,#
  • 4 . 連續取值:
  • 在時間點上使用-連接開頭和結束
  • #-#
  • 5, 在指定時間點上,定義步長;/#
  • /#:#即步長;
  • */2:每兩分鐘
  • 註意:指定的時間不能被步長整除時,其意義將不復存在;
  • 最小時間單位為分鐘, 想完成"秒級"任務,得需要額外借助其他機制;
  • 定義成每分鐘任務;而在利用腳本實現每分鐘之內循環執行的次數
  • 示例:
  • 1 . 3 * * * :每小時執行一次; 每小時第3分鐘;
  • 2 . 34* * 5;每周五的4點3分; 每周執行一次
  • 3 . 567* *: 每月執行一次:每月的7號的6點5分;
  • 4 . 78910*:每年執行一次:每年的10月9號8點7分;
  • 5 . 98**3,7:每周三和周日; 8點9分
  • 6 . 08,20**3,7: 每周日和周三 :8點和20點
  • 7 . 09-18**1-5: 工作時間內的每小時;周一到周五的白天的9-18點
  • 8 . */5****;每5分鐘執行一次某任務;

crontab命令

  • crontab[-u user]]-l | -e] [-i][-s]
  • -e :編輯任務:
  • crontab -l 列出所有任務
  • -r :移除所有任務;即刪除/var/spool/cron/USERNAME文件;
  • -i :在使用-r選項移除所有任務時提示用戶確認;
  • -u:user:root用戶可為指定用戶管理cron任務;
  • crontab -e -u user: ROOT指定用戶任務
  • 用戶自己也可以創建任務因為其擁有SUID權限
  • [[email protected] ~]# ll /usr/bin/crontab
  • -rwsr-xr-x. 1 root root 51784 Nov 10 2015 /usr/bin/crontab
  • crontab -l 查看自己的計劃任務
  • crontab -r 刪除自己所有任務
  • crontab -r -u user 刪除指定任務
  • crontab -r -u user -i 交互式指定刪除
  • 如果誤刪可以在 /var/spool/cron 日誌裏
  • 註意:運行結果以郵件通知給當前用戶; 如果拒絕接受郵件;
  • 1 COMMAND > /dev/null
  • 2COMMAND &>/dev/null
  • 註意:
  • 定義 COMMAND時,如果命令需要用到%,需要對其轉義;但防止與但因號中的%不用轉義亦可;
  • 如果某任務在指定的時間因關機未能執行,下次開機會不會自動執行?
  • 不會
  • 如果期望某時間故未能按時執行,下次開機後無論是否到了相應時間點都要執行一次,可使用anacron實現;
  • 練習:
  • 1 . 每12小時備份一次/etc目錄至/backups目錄中,保存文件名稱格式為"etc-yyyy-mm-dd-hh"
  • crontab -e 0 */12 * * * cp -a /etc/ /backups/etc-`date +%F` /
  • 2 . 每周2, 4 ,7備份/var/log/secure文件至/logs目錄中,文件格式為"secure-yyyymmdd";
  • crontab -e * * 2,4,7 * * cp -a /var/log/secure /logs/secure `date +%F`
  • 3 , 每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的行信息追加至/tmp/meminfo.txt文件中;
  • crontab -e 0 */2 * * * grep -E ‘^(S|M)‘ /proc/meminfo >> /tmp/meminfo.txt

進程管理及計劃任務