作業管理
·Linux的作業控制:
前臺作業:通過終端啟動,且啟動后一直占據終端;
后臺作業:可通過終端啟動,但啟動后即轉入后臺運行(釋放終端)
·如何讓作業運行于后臺?
(1)運行中的作業: Ctrl+z
(2)尚未啟動的作業:# COMMAND &
后臺作業雖然被送往后臺運行,但其依然與終端相關;退出終端,將關閉后臺作業。如果希望送往后臺后,剝離與終端的關系
命令:
# nohup COMMAND &
# screen;COMMAND
·查看所有作業:
# jobs
·作業控制:
# fg [[%]JOB_NUM] :把指定的后臺作業調回前臺
# bg [[%]JOB_NUM] :讓送往后臺的作業在后臺繼續運行
# kill [%JOB_NUM] :終止指定的作業
·并行運行:
同時運行多個進程,提高效率
(1)vi all.sh 寫一個腳本
f1.sh&
f2.sh&
f3.sh&
(2)(f1.sh&);(f2.sh&);(f3.sh&)
(3){ f1.sh& f2.sh& f3.sh& }
·進程優先級:
PRI優先級于系統優先級相反(ps命令中的參數)
系統: 0 —- 139
PRT: 139 —- 0
進程優先級調整:
靜態優先級:100-139
進程默認啟動時的nice 值為0 ,優先級為120
只有根用戶才能降低nice值(提高優先性),其他用戶只能提高自己所發起進程的nice
·nice 命令:
nice [OPTION] [COMMAND [ARG]…]
~]# nice -n -5 ping 127.0.0.1
~]# nice –5 ping 127.0.0.1
調整即將運行的程序的優先級
·renice 命令:
renice [-n] priority pid…
~]# renice -20 6754
~]# renice -n -10 6754
renice調整運行中的優先級
·查看:
ps axo pid,comm,n
Linux任務計劃、周期性任務執行
·未來的某時間點執行一次任務:at、batch
·周期性運行某任務:crontab
·執行結果: 會通過郵件發送給用戶
查看郵件服務是否打開:(25號端口)
# netstat -tnlp
# ss -tnlp
·本地電子郵件服務:
smtp:simple mail transmission procotol
pop3:Post office Procotol
imap4:Internet Mail Access Procotol
·mail:命令
mailx – send and receive Internet mail
MUA:Mail User Agent. 用戶收發郵件的工具程序
mail/mailx [-s 'SUBJECT'] username [@hostname]
郵件正文:
(1)輸入重定向
(2)通過管道
(3)交互式輸入
at命令:
·at [option] TIME
·常用選項:
-l:列出指定隊列中等待運行的作業;相當于atq
-d:刪除指定的作業;相當于atrm
-c:查看具體作業任務
-f /path/from/somefile:從指定的文件中讀取任務
-m:當任務 被完成之后,將給用戶發送郵件,即使沒有標準輸出
-q QUEUE:指明隊列
-V:顯示版本信息
·注意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
·TIME:定義出什么時候進行at這項任務的時間
HH:MM [YYYY-mm-dd]
noon, midnight, teatime(4pm)
tomorrow
now+# {minutes,hours,days, OR weeks}
·at時間格式
HH:MM ==> 02:00
在今日的HH:MM進行,若該時刻已過,則明天此時執行任務
HH:MM YYYY-MM-DD ==> 04:00 2016-09-20
規定在某年某月的某一天的特殊時刻進行該項任務
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某個時間點再加幾個時間后才進行該項任務
now + 5 minutes
04pm + 3 days
·執行方式:
1)交互式
2)輸入重定向
3)at –f 文件
·依賴與atd服務, 需要啟動才能實現at任務
服務: service atd status
·at隊列存放在/var/spool/at目錄中,可以通過修個文件來改變隊列中的命令
·通過/etc/at.{allow,deny}控制用戶是否能執行at任務
·先尋找/etc/at.allow文件,文件中的使用者才能使用at,沒有在這個文件中的使用者則不能使用at(即使沒有寫在at.deny當中)
·如果/etc/at.allow找不存在,就尋找/etc/at.deny這個文件,若寫在這個at.deny用的使用者則不能使用at,而沒有在這個at.deny文件中的使用者則可使用at命令
·如果兩個文件都不存在有,只有root用可以使用at這個命令
# cat /etc/at.deny //文件格式
gao //禁止使用at命令的USERNAME
hlr
·batch命令:
batch會讓系統自行選擇空閑時間去執行此處指定的任務
常用選項同at命令
周期性任務計劃:cron
·相關的程序包:
cronie:主程序包,提供crond守護進程及相關輔助工具
cronie-anacron:cronie的補充程序;用于監控cronie任務執行狀況;如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務
crontabs :包含CentOS提供系統維護任務
·確保crond守護處于運行狀態:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
·計劃周期性執行的任務提交給crond,到指定時間會自動運行
cron任務分為兩類:
系統cron任務:主要用于實現系統自身的維護
手動編輯/etc/crontab文件
用戶cron任務:
命令:crontab命令
·日志:/var/log/cron
·系統cron的配置文件:/etc/crontab
注釋行以#開頭
詳情參見man 5 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
注意:
(1)每行定義一個周期任務,共7個字段
* * * * * :定義周期性時間
user-name :定義運行任務的身份
command to be executed :任務
(2)此處的環境變量不同于用戶登錄后獲得的環境變量,因此建議命令使用絕對路徑或者定義PATH環境變量
(3)執行結果以郵件發送給MAILTO指定的用戶
·用戶cron的配置文件:/var/spool/cron/USERNAME
# 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
# | | | | |
# * * * * * command to be executed
注意:
(1)每行定義一個周期任務,共6個字段
(2)此處的環境變量不同于用戶登錄后獲得的環境變量,因此建議命令使用絕對路徑或者定義PATH環境變量
(3)郵件發送給用戶
·時間表示法:(5個 * * * * * 的表示法)
(1)特定值;
給定時間點有效取值范圍內的值
注意:day of month(3) 和 day of week(5) 同時使用表示或的關系
(2) *
給定時間點上有效取值范圍內的所有值,表示“每…”
(3)離散取值:,
在時間點上使用逗號分隔多個值
#,#,#
(4)連續取值:-
#-#
(5)在指定時間范圍上,定義步長:
*/#: # 即為步長
例如:每3小時echo 命令;
0 */3 * * * centos /bin/echo "howdy!"
例如:晚上9點10分運行echo命令;
10 21 * * * centos /bin/echo "Howdy!"
例如:
(1) 3 * * * * :每小時的第3分鐘執行
(2) 3 4 * * 5 :每周五的04:03執行
(3) 5 6 7 * * :每月7號的06:05執行
(4) 7 8 1 2 * :每年的2月1號08:07執行
(5) 8 8 * * 3,7 :每周三和周日08:08執行
(6) 0 8,20 * * 1,5 :每周1周五08:00和20:00執行
(7) 0 9-18 * * 1-6 :每周1-6的09:00-18:00每小時執行一次
(8) */5 * * * * :每5分鐘執行一次
(9) */7 * * * * :每7分組執行一次,但最后一次4分組執行
·特殊時間格式
@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/ 每月腳本
·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 :要執行的任務
·管理臨時文件:
rhel6.0 使用/etc/cron.daily/tmpwatch 定時清除臨時文件
rhel7.0 使用systemd-tmpfiles-setup 服務實現
·crontab命令定義了每個用戶都有專用的cron任務文件:
/var/spool/cron/USERNAME
·crontab命令:
crontab [-u user] [-l | -r | -e] [-i]
-e:編輯任務;
-l:列出所有任務;
-r:移除所有任務;
-i:同 -r 一起使用,以交互式模式移除指定任務
-u user:僅root可運行,指定用戶管理cron任務
·控制用戶執行計劃任務 :
/etc/cron.{allow,deny}
·先尋找/etc/cron.allow文件,文件中的使用者才能使用crontab,沒有在這個文件中的使用者則不能使用crontab(即使沒有寫在cron.deny當中)
·如果/etc/cron.allow找不存在,就尋找/etc/cron.deny這個文件,若寫在這個cron.deny用的使用者則不能使用crontab,而沒有在這個cron.deny文件中的使用者則可使用crontab命令
·如果兩個文件都不存在有,只有root用可以使用crontab這個命令
·注意:運行結果的標準輸出和錯誤以郵件通知給相關用戶
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
·對于cron任務來講,%有特殊用途;如果在命令中要使用%,則需要轉義;不過,如果把%放置于單引號中,也可以不用轉義
·思考:
(1) 如何在秒級別運行任務?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
(2) 如何實現每7分鐘運行一次任務?
* * * * * for min in 0 1 2; do echo "hi"; sleep 7m; done
sleep命令:
sleep NUMBER[SUFFIX]…
SUFFIX:
s:秒, 默認
m:分
h:小時
d:天
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
沒有被重定向的輸出會被郵寄給用戶
根用戶能夠修改其它用戶的作業
作業
1、每周2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如“messages-yyyymmdd”
0 0 * * 2,4,7 cp /var/log/messages /logs/messages-`date +\%Y\%m\%d`
2、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
0 */2 * * * grep "^[SM]" /proc/meminfo >> /tmp/meminfo.txt
原創文章,作者:megedugao,如若轉載,請注明出處:http://www.www58058.com/45282