進程概念
內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等 Process: 運行中的程序的一個副本,是被載入內存的一個指令集合 進程ID(Process ID,PID)號碼被用來標記各個進程 UID、GID、和SELinux語境決定對文件系統的存取和訪問權限, 通常從執行進程的用戶來繼承 存在生命周期 task struct:Linux內核存儲進程信息的數據結構格式 task list:多個任務的的task struct組成的鏈表 進程創建: init:第一個進程 父子關系 進程:都由其父進程創建,COW fork(), clone() 進程優先級 系統優先級:數字越小,優先級越高 0-139(CentOS4,5) 各有140個運行隊列和過期隊列 0------97--98--99(CenOS6) 實時優先級:99-0:值最大優先級最高 Nice值:-20,19對應系統優先級100-139或99 top命令 RT---------------RT--0------20------39 RT對應系統優先級的0-99 cenos6 系統優先級 0------------------97--98--99------------------99 實時優先級 99-------------------2---1--0 nice優先級 -20 --- -19 ---0-----20 注:nice優先級,調的是對應系統優先級的99-99,效果不明顯。 top命令 RT-- -99 ------- -3 -2 0------20------39 注:0左面的是負數 Big O:時間復雜度,用時和規模的關系 O(1), O(logn), O(n)線性, O(n^2)拋物線, O(2^n)
進程相關概念
進程內存: Page Frame: 頁框,用存儲頁面數據,存儲Page 4k LRU:Least Recently Used 近期最少使用算法,釋放內存 物理地址空間和線性地址空間 MMU:Memory Management Unit負責轉換線性和物理地址 IPC: Inter Process Communication 同一主機上 signal shm: shared memory semophore信號量,一種計數器 不同主機上: rpc: remote procedure call socket: IP和端口號 進程狀態 Linux內核:搶占式多任務(優先級高的,分配的cpu時間片多一點) 進程類型: 守護進程: daemon,在系統引導過程中啟動的進程,和終端無關進程 前臺進程:跟終端相關,通過終端啟動的進程 注意:兩者可相互轉化 進程狀態: 運行態:running 就緒態:ready 睡眠態: 可中斷:interruptable 不可中斷:uninterruptable 例如cat一個很大的文件,cat程序需要等待io。 停止態:stopped,暫停于內存中,但不會被調度,除非手動啟動 例如vim打開后 僵死態:zombie,結束進程,父進程結束前,子進程不關閉
系統管理工具
進程的分類: CPU-Bound:CPU密集型,非交互 (計算型) IO-Bound:IO密集型,交互 (dd命令) Linux系統狀態的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup pstree命令: pstree-display a tree of processes -p 顯示進程樹進程的pid
ps
ps: process state ps-report a snapshot of the current processes Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中 什么參數也跟,默認顯示,當前終端的進程。 [root@centos7 ~]# ps PID TTY TIME CMD 10277 pts/1 00:00:01 bash 11392 pts/1 00:00:00 ps 適用ps來查看進程信息 ps[OPTION]... 支持三種選項: UNIX選項如-a BSD選項如a GUN選項如--help ?默認顯示當前終端中的進程 ?a選項包括所有終端中的進程 ?x選項包括不鏈接終端的進程,沒有與終端關聯的進程。 ?u選項顯示進程所有者的信息 ?f選項顯示進程的父進程 ?o屬性… 選項顯示定制的信息: pid、comm、%cpu、%mem、state、tty、euser、ruser
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND VSZ: Virtual memory SiZe,虛擬內存集,線性內存 RSS: ReSidentSize, 常駐內存集 STAT:進程狀態 R:running S: interruptables leeping 可中斷的 D: uninterruptable sleeping 不可中斷的 T: stopped Z: zombie +: 前臺進程 l: 多線程進程 N:低優先級進程 <: 高優先級進程 s: session leader,會話(子進程)發起者 TIME:該進程累計占用cpu的時間 常用組合:-ef -e: 顯示所有進程 -f: 顯示完整格式程序信息 常用組合:-eFH -F: 顯示更完整格式的進程信息 -H: 以進程層級格式顯示進程相關信息 常用組合:自定義 -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm axo stat,euid(有效uid),ruid(真實uid),tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm auxf :進程的父進程也顯示出來 ni: nice值 pri: priority,系統優先級 rtprio: 實時優先級 psr: processor, CPU編號 [root@localhost yum.repos.d]# ps ax o pid,ni PID NI 1 0 2 0 3 0 7 - 8 0
常用選項
ps aux ps auxf ps auxfo euid ruid ... ps axo pid,comm,%cpu,nice [root@localhost yum.repos.d]# ps axo pid,comm,%cpu,nice PID COMMAND %CPU NI 1 systemd 0.0 0 2 kthreadd 0.0 0 3 ksoftirqd/0 0.0 0 7 migration/0 0.0 - 8 rcu_bh 0.0 0 9 rcuob/0 0.0 0 10 rcuob/1 0.0 0 注:o后面必須跟 想要顯示的選項。 ps -ef ps -eFH
ps搜索
最靈活:ps選項| 其它命令 借助于管道
pgrep/pkill
進程搜索
按預定義的模式:pgrep
pgrep[options] patter
-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示父進程為此處指定的進程的進程列表
pgrep -t pts/0 l
顯示pts/0終端運行的進程, l 顯示進程名稱
pgrep -t pts/0 -a
顯示的更詳細,命令的參數都顯示出來。
pgrep -P 24944 -a 24979 passwd 顯示24944的子進程,pid是24979 名稱 passwd pidof /sbin/pidof 按確切的程序名稱: $ pidof bash 顯示系統中運行的bash進程。例如開其了多個終端,就會有多個進程。
系統工具
uptime 顯示當前時間,系統已啟動的時間、當前上線人數,系統平均負載(1、5、15分鐘的平均負載,一般不會超過1) 系統平均負載: 指在特定時間間隔內運行隊列中的平均進程數。 如果每個CPU內核的當前活動進程數不大于3的話,那么系統的性能良好。如果每個CPU內核的任務數大于5,那么這臺機器的性能有嚴重問題。 如果linux主機是1個雙核CPU的話,當Load Average 為6的時候說明機器已經被充分使用了。 [root@localhost]# uptime -p up 6 hours, 48 minutes
進程管理工具
top
實時跟蹤,動態先顯示內存cpu情況
top - 23:53:18 up 7:33, 3 users, load average: 0.05, 0.06, 0.06 ##相當于uptime Tasks: 364 total, 2 running, 362 sleeping, 0 stopped, 0 zombie ##進程信息 %Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st###cpu信息 KiB Mem : 1001332 total, 113420 free, 168424 used, 719488 buff/cache ##內存信息 KiB Swap: 2098172 total, 2098172 free, 0 used. 611316 avail Mem ##內存信息 上面的信息可以關閉顯示。 top:有許多內置命令: 排序: P:以占據的CPU百分比,%CPU M:占據內存百分比,%MEM T:累積占據CPU時長,TIME+ 首部信息顯示: uptime信息:l命令 tasks及cpu信息:t命令 centos7切換顯示方式或關閉。 cpu分別顯示:1 (數字) memory信息:m命令 退出命令:q 修改刷新時間間隔:s 默認是三秒 不建議刷新間隔太小,會給系統改造成負擔 終止指定進程:k centos7會給出個默認的pid cup使用率最高的??梢允謩又付╬id 選擇pid 然后 Kill PID 1684 with signal [15]:默認發送15號信號。 保存文件:W 存到用戶的家目錄下 默認名字 .toprc 執行top后 輸入上面相應指令集可以操作。 欄位信息簡介 us:用戶空間 sy:內核空間 ni:調整nice時間 id:空閑 wa:等待IO時間 hi:硬中斷 si:軟中斷(模式切換) st:虛擬機偷走的時間 PID (Process Id):任務的進程IDPPID (Parent Process Pid):父任務的進程IDRUSER (Real User Name):任務的所有者真實名稱UID (User Id):任務所有者IDUSER (User Name):任務所有者名稱GROUP (Group Name):任務所有者群組名TTY (Controlling Tty):終端PR (Priority):優先級%CPU (CPU usage):CPU使用率 %MEM (Memory usage (RES)):內存使用率 S (Process Status):進程狀態 TIME+ (CPU Time, hundredths):CPU時間,精確到秒 top [OPENTION] -d #: 指定刷新時間間隔,默認為3秒 -b: 以批次方式 一般情況屏幕顯示不全,-b 一屏的往下翻,循環。 -n #: 顯示多少批次 刷新次數完畢退出,默認是一直刷新,但是時間間隔可以指定-d。 -p cpu使用率排序 (默認) top -d 5 -n 3 每隔5秒刷新一次,刷新3次
htop命令:需從Fedora-EPEL源安裝
默認帶菜單,帶顏色。f1-f10快捷鍵
http://172.16.0.1/fedora-epel/7/x86_64 選項: -d #: 指定延遲時間; -u UserName: 僅顯示指定用戶的進程; -s COLUME: 以指定字段進行排序; 子命令:執行htop以后執行的子命令 s: 跟蹤選定進程的系統調用; l: 顯示選定進程打開的文件列表; a:將選定的進程綁定至某指定CPU核心; t: 顯示進程樹
內存工具
vmstat命令:虛擬內存信息 vmstat[options] [delay [count]] vmstat 2 5 2秒刷新一次,刷新5次 默認刷新一次 [root@localhost ~]# vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 8 126136 1596 711028 0 0 13 16 37 40 0 0 99 0 0 顯示完畢就退出
顯示內容
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:Timespent 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@localhost ~]# vmstat -s 1001332 K total memory 162076 K used memory 316484 K active memory 236640 K inactive memory 126664 K free memory 1596 K buffer memory 710996 K swap cache 2098172 K total swap 8 K used swap 2098164 K free swap 4521 non-nice user cpu ticks 695 nice user cpu ticks 10009 system cpu ticks 2950649 idle cpu ticks 3636 IO-wait cpu ticks 0 IRQ cpu ticks 160 softirq cpu ticks 0 stolen cpu ticks 371505 pages paged in 458693 pages paged out 0 pages swapped in 2 pages swapped out 1086138 interrupts 1188701 CPU context switches 1471940397 boot time 47448 forks
pmap
pmap命令:進程的內存映射 report memory map of a process pmap[options] pid[...] -x: 顯示詳細格式的信息; #pmap 1 另外一種實現: # cat /proc/PID/maps pmap PID -x [root@localhost ~]# pmap 47188 -x 47188: -bash Address Kbytes RSS Dirty Mode Mapping 0000000000400000 884 648 0 r-x-- bash 00000000006dc000 4 4 4 r---- bash 00000000006dd000 36 36 36 rw--- bash 00000000006e6000 24 24 24 rw--- [ anon ] 0000000001f1b000 1456 1328 1328 rw--- [ anon ] 00007f1d2f25f000 103580 52 0 r---- locale-archive 00007f1d35786000 44 20 0 r-x-- libnss_files-2.17.so 00007f1d35791000 2044 0 0 ----- libnss_files-2.17.so 00007f1d35990000 4 4 4 r---- libnss_files-2.17.so 00007f1d35991000 4 4 4 rw--- libnss_files-2.17.so 00007f1d35992000 24 0 0 rw--- [ anon ] 00007f1d35998000 1752 660 0 r-x-- libc-2.17.so 00007f1d35b4e000 2048 0 0 ----- libc-2.17.so 00007f1d35d4e000 16 16 16 r---- libc-2.17.so 00007f1d35d52000 8 8 8 rw--- libc-2.17.so 00007f1d35d54000 20 20 20 rw--- [ anon ] 00007f1d35d59000 12 8 0 r-x-- libdl-2.17.so 00007f1d35d5c000 2044 0 0 ----- libdl-2.17.so 00007f1d35f5b000 4 4 4 r---- libdl-2.17.so 00007f1d35f5c000 4 4 4 rw--- libdl-2.17.so 00007f1d35f5d000 148 124 0 r-x-- libtinfo.so.5.9 00007f1d35f82000 2048 0 0 ----- libtinfo.so.5.9 00007f1d36182000 16 16 16 r---- libtinfo.so.5.9 00007f1d36186000 4 4 4 rw--- libtinfo.so.5.9 00007f1d36187000 132 116 0 r-x-- ld-2.17.so 00007f1d3638f000 12 12 12 rw--- [ anon ] 00007f1d3639e000 4 4 4 rw--- [ anon ] 00007f1d3639f000 28 24 0 r--s- gconv-modules.cache 00007f1d363a6000 8 8 8 rw--- [ anon ] 00007f1d363a8000 4 4 4 r---- ld-2.17.so 00007f1d363a9000 4 4 4 rw--- ld-2.17.so 00007f1d363aa000 4 4 4 rw--- [ anon ] 00007fff60224000 132 24 24 rw--- [ stack ] 00007fff602a7000 8 4 0 r-x-- [ anon ] ffffffffff600000 4 0 0 r-x-- [ anon ] ---------------- ------- ------- ------- total kB 116596 3188 1532
系統監控工具
glances
glances命令:EPEL源 交直觀的現實系統狀態,cpu 內存 進程 文件系統 網絡 等狀態 glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--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 iSort 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 hddtempstats 常用選項: -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:要連入的服務器端地址
dstat
dstat命令:系統資源統計 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: 顯示延遲最大的進程 PLUGINS While anyone can create their own dstat plugins (and contribute them) dstat ships with a number of plugins already that extend its capabilities greatly. Here is an overview of the plugins dstat ships with: 電源 風扇 mysql wifi 報文 網絡 磁盤 cpu........
進程管理工具
kill
kill命令: 向進程發送控制信號,以實現對進程管理 顯示當前系統可用信號:kill -l 常用信號:man 7 signal 1) SIGHUP: 無須關閉進程而讓其重讀配置文件 2) SIGINT: 中止正在運行的進程;相當于Ctrl+c 9) SIGKILL: 殺死正在運行的進程 15) SIGTERM:終止正在運行的進程 18) SIGCONT: 19) SIGSTOP: 指定信號的方法: (1) 信號的數字標識;1, 2, 9 (2) 信號完整名稱;SIGHUP (3) 信號的簡寫名稱;HUP 按PID:kill [-SIGNAL] pid… 按名稱:killall[-SIGNAL] comm… 按模式:pkill[options] pattern -SIGNAL -u uid: effective user,生效者 -U uid: real user,真正發起運行命令者 -t terminal: 與指定終端相關的進程 -l: 顯示進程名 -a: 顯示完整格式的進程名 -P pid: 顯示父進程為此處指定的進程的進程列表
作業管理
Linux的作業控制
前臺作業:通過終端啟動,且啟動后一直占據終端;
后臺作業:可通過終端啟動,但啟動后即轉入后臺運行(釋放終端)
如何讓作業運行于后臺?
(1) 運行中的作業:Ctrl+z
(2) 尚未啟動的作業:# COMMAND &
此類后臺作業雖然被送往后臺運行,但其依然與終端相關;退出終端,將關閉后臺作業。如果希望送往后臺后,剝離與終端的關系:
# nohup COMMAND &
查看所有作業:
# jobs
作業控制:
# fg[[%]JOB_NUM]:把指定的后臺作業調回前臺; # bg[[%]JOB_NUM]:讓送往后臺的作業在后臺繼續運行; # kill [%JOB_NUM]:終止指定的作業;
并行運行
vi f4.sh
F1.sh&
F2.sh&
F3.sh&
( (f1.sh&);(f2.sh&);(f3.sh&)) { f1.sh& f2.sh& f3.sh& }
進程優先級
進程優先級調整: 靜態優先級:100-139 進程默認啟動時的nice值為0,優先級為120 只有根用戶才能降低nice值(提高優先性
)
nice命令:
nice [OPTION] [COMMAND [ARG]…]
renice命令: renice[-n] priority pid... 查看: ps axo pid,comm,ni
任務計劃
Linux任務計劃、周期性任務執行
未來的某時間點執行一次任務:at, batch
周期性運行某任務: cron
at命令
at命令: at [option] TIME TIME: ##時間點 HH:MM [YYYY-mm-dd] noon, midnight, teatime tomorrow now+#{minutes,hours,days, OR weeks} 常用選項: -q QUEUE: -l: 列出指定隊列中等待運行的作業;相當于atq -d: 刪除指定的作業;相當于atrm -c: 查看具體作業任務 -f /path/from/somefile:從指定的文件中讀取任務 -m:強制at發送郵件,表示執行完畢
/var/spool/at at任務的任務列表即使重啟主機后,也不會丟失任務
at是以服務形式在系統中工作 /etc/rc.d/init.d/atd 首先要保證服務已經正常運行。
root@localhost ~]# systemctl status atd ###centos7 [root@yangyouwei ~]# service atd status ###centos6 atd (pid 7182) is running...
如果atd服務沒有啟動
[root@yangyouwei ~]# at now +1minutes at> ls at> echo "hello word" at> <EOT> job 1 at 2016-07-21 18:19 Can't open /var/run/atd.pid to signal atd. No atd running?
at.deny 默認為空,黑名單
at.allow 沒人沒有此文件,白名單
The superuser may use these commands in any case. For other users, permission to use at is determined by the files /etc/at.allow and /etc/at.deny. ##控制普通用戶使用at命令,通過兩個文件控制,at.allow/at.deny If the file /etc/at.allow exists, only usernames mentioned in it are allowed to use at.##r如果at.allow文件存在,則只有在其中的用戶才能使用at命令 If /etc/at.allow does not exist, /etc/at.deny is checked, every user- name not mentioned in it is then allowed to use at.如果不存在白名單,其他用戶又不在黑名單中, 則可以使用at命令 If neither exists, only the superuser is allowed use of at. 如果兩個文件都不存在則僅管理員可硬使用at An empty /etc/at.deny means that every user is allowed use these com- mands, this is the default configuration. 默認黑名單為空,所有用戶都可以使用at命令。
at and batch read commands from standard input or a specified file which are to be executed at a later time, using /bin/sh.
at和batch通過標準輸入或文件獲取要執行的命令,使用/bin/sh在指定的時間運行它們。
手動執行
[root@yangyouwei ~]# at now +1minutes
at> cd /
at> ###ctrl+d
job 3 at 2016-07-21 18:24
[root@yangyouwei ~]# at -l
6 2016-07-21 18:36 a root ###前面的數字為任務號
[root@yangyouwei ~]# ls /var/spool/at/ ###生成任務后,會在/var/spool/at/目錄下生成任務文件。(腳本,其中定義了運行要執行任務需要的變量等..) a0000601759c71 ##作業號加隨機數 at -c 5 查看任務相當cat /var/spool/at/a0000601759c71
通過文件獲取任務
at now +1min -f FILE -q at now +min -q < /PATH/TO/FILE
注意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶.編寫腳本時將標準輸出和標準錯誤輸出都重新定向到/dev/null
crond也一樣有標準輸出的都要重新定向到/etc/null,較長的任務,不建議使用at直接寫入,最好寫入腳本,使用at執行腳本。
at命令也支持 -f 通過文件獲取要執行的任務,用戶手動創建任務,可以使用標準輸入,手動輸入任務命令。
即使沒有標準輸出的任務,也可以強制給用戶郵件,提示用戶任務執行完畢。 at -m
如果指定時間,沒指定日期,時間小于當前時間。則任務默認第二天的那個時間運行。
普通用戶創建的任務,時間到期后,atd會使用普通用戶身份開啟shell,后運行任務。
計劃任務
batch命令:
讓系統自行選擇空閑時間去執行此處指定的任務
周期性任務計劃:cron
使用cron可以實現用戶人和系統任務
用戶任務需要用戶使用crontab命令自己添加。
相關的程序包: cronie: 主程序包,提供crond守護進程及相關輔助工具 cronie-anacron:cronie的補充程序;用于監控cronie任務執行狀況;如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務 主要針對家用電腦,筆記本。服務器作用不大。 crontabs:包含CentOS提供系統維護任務 主要針對系統周期性服務的。 cronie [root@yangyouwei ~]# rpm -q cronie cronie-1.4.4-15.el6_7.1.x86_64 [root@yangyouwei ~]# rpm -ql cronie /etc/cron.d /etc/cron.d/0hourly /etc/cron.deny /etc/pam.d/crond /etc/rc.d/init.d/crond /etc/sysconfig/crond /usr/bin/crontab /usr/sbin/crond /usr/share/doc/cronie-1.4.4 /usr/share/doc/cronie-1.4.4/AUTHORS /usr/share/doc/cronie-1.4.4/COPYING /usr/share/doc/cronie-1.4.4/ChangeLog /usr/share/doc/cronie-1.4.4/INSTALL /usr/share/doc/cronie-1.4.4/README /usr/share/man/man1/crontab.1.gz /usr/share/man/man5/crontab.5.gz /usr/share/man/man8/cron.8.gz /usr/share/man/man8/crond.8.gz /var/spool/cron cronie-anacron [root@yangyouwei ~]# rpm -q cronie-anacron cronie-anacron-1.4.4-15.el6_7.1.x86_64 [root@yangyouwei ~]# rpm -lq cronie-anacron /etc/anacrontab /etc/cron.hourly/0anacron /usr/sbin/anacron /usr/share/man/man5/anacrontab.5.gz /usr/share/man/man8/anacron.8.gz /var/spool/anacron /var/spool/anacron/cron.daily /var/spool/anacron/cron.monthly /var/spool/anacron/cron.weekly crontabs [root@yangyouwei ~]# rpm -q crontabs crontabs-1.10-33.el6.noarch [root@yangyouwei ~]# rpm -lq crontabs /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly /etc/crontab ###系統周期性任務,普通用戶無權限更改。 /usr/bin/run-parts /usr/share/man/man4/crontabs.4.gz 確保crond守護處于運行狀態: CentOS 7: systemctlstatus crond ...running... CentOS 6: service crondstatus 計劃周期性執行的任務提交給crond,到指定時間會自動運行 系統cron任務:系統維護作業 /etc/crontab ###系統周期任務文件 用戶cron任務: crontab命令
系統周期性任務
系統cron任務:/etc/crontab [root@yangyouwei ~]# cat /etc/crontab SHELL=/bin/bash 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 ###user-name指的是命令以誰的身份執行的。 例如:晚上9點10分運行echo命令; 10 21 * * *gentoo/bin/echo "Howdy!"
可以直接編輯此文件,添加系統周期任務任務。運行系統任務,會生成日志
/var/log/cron 用戶自己創建的任務
時間表示法:
(1) 特定值; 給定時間點有效取值范圍內的值 (2) * 給定時間點上有效取值范圍內的所有值 表示“每...” (3) 離散取值: #,#,# (4) 連續取值:- #-# (5) 在指定時間范圍上,定義步長: /#: #即為步長 例如:每3小時echo命令; 0 */3 * * * gentoo/bin/echo "howdy!"
時間表示
@reboot : Run once after reboot.
@yearly : Run once a year, ie. "0 0 1 1 ".
@annually : Run once a year, ie. "0 0 1 1 ".
@monthly : Run once a month, ie. "0 0 1 ".
@weekly : Run once a week, ie. "0 0 0".
@daily : Run once a day, ie. "0 0 ".
@hourly : Run once an hour, ie. "0 *".@hourly user-name command to be executed
系統的計劃任務腳本
/etc/crontab 系統周期任務文件 /etc/cron.d/ 配置文件 /etc/cron.hourly/ 腳本 /etc/cron.daily/腳本 /etc/cron.weekly/腳本 /etc/cron.monthly/腳本 [root@yangyouwei ~]# ls /etc/cron.d ###配置文件 0hourly raid-check sysstat [root@yangyouwei ~]# cat /etc/cron.d/0hourly SHELL=/bin/bash ##使用那個shell運行腳本 PATH=/sbin:/bin:/usr/sbin:/usr/bin ##路徑變量 MAILTO=root ##郵件發送給給root HOME=/ ##執行腳本時的工作目錄 01 * * * * root run-parts /etc/cron.hourly ##每小時運行/etc/cron.hourly/目錄下的所有腳本 [root@yangyouwei ~]# ls /etc/cron.hourly/ 0anacron [root@yangyouwei ~]# cat /etc/cron.hourly/0anacron #!/bin/bash # Skip excecution unless the date has changed from the previous run if test -r /var/spool/anacron/cron.daily; then day=`cat /var/spool/anacron/cron.daily` fi if [ `date +%Y%m%d` = "$day" ]; then exit 0; fi # Skip excecution unless AC powered if test -x /usr/bin/on_ac_power; then /usr/bin/on_ac_power &> /dev/null if test $? -eq 1; then exit 0 fi fi /usr/sbin/anacron -s
[root@yangyouwei ~]# which run-parts
/usr/bin/run-parts
是個命令,可以依次運行某個目錄下的所有腳本。不是并行運行所有腳本
run-parts /PATH/TO/ ##后接一個目錄即可。
anacron
運行計算機關機時cron不運行的任務,CentOS6.0以后版本取消anacron服務,由crond服務管理。 假設計算機沒有一直開機 對筆記本電腦、臺式機、工作站及其它不一直開機的系統很重要 對偶爾要關機的服務器很有用 配置文件:/etc/anacrontab,負責執行/etc/ cron.daily/etc/cron.weekly/etc/cron.monthly中系統任務。/etc/cron.hourly/由/cron.d/0hourly執行 ?字段1:如果在這些日子里沒有運行這些任務…… ?字段2:在重新引導后等待這么多分鐘后運行它 ?字段3:任務識別器,在日志文件中標識 ?字段4:要執行的任務 ?當執行任務時,更新/var/spool/anacron/文件時間戳
管理臨時文件
rhel7.0之前使用tmpwatch工具定時清除臨時文件。 rhel7.0使用systemd-tmpfiles-setup服務實現 配置文件: /etc/tmpfiles.d/*.conf /run/tmpfiles.d/*.conf /usr/lib/tmpfiles/*.conf /usr/lib/tmpfiles.d/tmp.conf d /tmp 1777 root root 10d d /var/tmp 1777 root root 30d 命令: systemd-tmpfiles –clean|remove|create configfile
用戶cron:
用戶自定義的周期性任務使用,crontab命令實現
crontab命令定義,每個用戶都有專用的cron任務文件:/var/spool/cron/USERNAME crontab命令: crontab[-u user] [-l | -r | -e] [-i] -l: 列出所有任務; -e: 編輯任務; -r: 移除所有任務; -i:同-r一同使用,以交互式模式移除指定任務 -u user: 僅root可運行,指定用戶管理cron任務 at和crontab 一次性作業使用at 重復性作業使用crontab Create at time crontab -e List at -l crontab -l Details at -c jobnum N/A Remove at -d jobnum crontab -r Edit N/A crontab -e 沒有被重定向的輸出會被郵寄給用戶 root用戶能夠修改其它用戶的作業
crontab -e
* command to be executed ###不用寫user-name默認以當前創建用戶的身份執行。
[root@yangyouwei ~]# crontab -e
no crontab for root – using an empty one
wall hello
~
~
~
~
~
"/tmp/crontab.4oxhQU" 1L, 21C written
crontab: installing new crontab
[root@yangyouwei ~]# ll /var/spool/cron/
total 4
-rw——-. 1 root root 21 Jul 21 22:32 root
[root@yangyouwei ~]#
注意:運行結果的標準輸出和錯誤以郵件通知給相關用戶
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
對于cron任務來講,%有特殊用途;如果在命令中要使用%,則需要轉義;不過,如果把%放置于單引號中,也可以不用轉義;
思考:
(1) 如何在秒級別運行任務?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
(2) 如何實現每7分鐘運行一次任務?
sleep命令:
sleep NUMBER[SUFFIX]…
SUFFIX:
s: 秒, 默認
m: 分
h: 小時
d: 天
練習
1、每4小時備份一次/etc目錄至/backup目錄中,保存的文件名稱格式為“etc-yyyy-mm-dd-HH.tar.xz”
2、每周2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如“messages-yyyymmdd”
3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
4、工作日時間內,每小執行一次“ip addr show”命令
原創文章,作者:yyw,如若轉載,請注明出處:http://www.www58058.com/44971
文章結構清晰,層次分明,贊一個哦。