linux系統作業控制的命令:
job(作業):一個作業通常包含多個命令(也有可能只包含一個),聯合起來由單個小程序組合,完成復雜任務,對Linux而言作業有兩種;前臺作業和后臺作業
前臺作業(forgroud):通過終端啟動,且啟動后會一直占據終端;例如:vim,cp等
后臺作業(backgroud):可以通過終端啟動,但啟動后其轉入后臺運行(釋放終端),有些服務類進程,都是運行在后臺的。甚至有些服務類進程有能力運行在后臺,但它不是默認的,你需要手工指定讓其運行在后臺。
大多數情況下,如果我們在命令行運行的命令不支持前臺運行的話,它將直接運行在后臺
如何讓作業運行與后臺?(有兩種方式)
(1)運行中的作業
ctrl+z(注意:此種方式送往后臺,作業會轉為停止態)
(2):尚未啟動的作業
#command & (在運行時,命令后邊加一個&符號,這就表示把它送往后臺了,此種方法即便是送往后臺,他仍然是與終端相關的;進程有兩類;與終端相關的進程和與進程無關的進程,任何與終端相關的進程,只要終端終止了,進程也一定會終止,哪怕運行與后臺也是如此)
注意:此類作業雖然被送往后臺,但其依然與終端相關;如果希望把送往后臺的作業剝離與終端的關系
# nohup command & (這表示把其運行為作業以后立即轉為與終端無關模式)
使用jobs命令可以查看后臺的作業列表
示例:
調往后臺的作業的控制命令
fg:[[%]job_num]把作業從后臺調往前臺;把指定的作業調回前臺
bg:[[%]job_num]讓后臺那些停止的作業繼續運行;讓送往后臺的作業在后臺繼續運行
kill:[[%]job_num]]此kill是為了kill作業的,不是kill進程的;終止指定的作業
注意:這些命令可以在運行時直接帶上作業號來執行;例如# fg [%[job_num]],%號可省,作業號就是使用jobs命令在行首所查看到的號碼,如果我們在執行這些命令的時候沒有指明作業號的情況下,jobs命令下看到的+號作業是默認首先被執行的作業,依次是—號;這就是它的優先級。對于kill命令,%號和作業號不可省略
并行運行:同時運行多個進程:開啟多個子進程同時執行任務
命令格式
(cmd&);(cmd&);(cmd&)
]# (ping 10.1.0.1&);(ping 10.1.249.189&);(ping 10.1.252.213&)
{cmd& cmd& cmd&}
linux任務計劃:就是讓用戶需要執行的任務在未來的某一時間點自動執行。linux的任務計劃分為兩類;但一次性任務計劃,和周期性任務計劃;
at命令:處理僅執行一次就結束任務計劃的命令。
batch命令:batch會讓系統自行選擇在系統資源較空閑的時間去執行指定的任務;無需指明執行任務的時間
crontab:這個指令所設置的任務將會循環的一直進行下去! 可循環的時間為分鐘、小時、每周、每月或每年等。crontab 除了可以使用指令執行外,也可以編輯 /etc/crontab 。 至于讓 crontab 可以生效的服務則是 crond 這個服務喔
所有的這些任務的執行結果都會通過郵件發送給用戶;首先使用~]# netstat -tnlp和~]# ss -tnl命令來查看25端口,確認郵寄服務開啟
at:命令:要使用一次性任務計劃時,系統上面必須要有atd這個服務。 不過并非所有的Linux distributions 都默認會把他打開的,所以呢,某些時刻必須要手動將他啟用才行。命令格式;at [option]…TIME;at的作業有隊列,用單個字母表示,默認都使用a隊列;at命令支持腳本參數,但是其運行環境略有不同,有些命令需要指明絕對路徑才行
常用選項
-l:查看作業隊列,相當于atq
-f:/path/from/somfile:從指定文件中讀取作業任務(將要執行的任務編輯在一個文件中),而不用在交互式輸入;
-d:刪除指定的作業,相當于atrm(需指明作業號,例如 at -d 3,atrm 3)
-c:查看指定作業的具體內容,(需指明作業號)
-q QUEUE:指明隊列;
TIME的表示格式:
HH:MM [YYYY-mm-dd]小時分鐘(年月日可省)
noon(中午12點),midnight(午夜12點),teatime(下午4點)
tomorrow(明天)
now+#:從現在起往后多次時間(需要指定一個時間,UNIT(時間單位):minutes(分鐘),hourem(小時),days(天),OR weeks)
at命令的黑名單:/etc/at.deny 這個文件,若寫在這個 at.deny 的用戶名則不能使用 at ,而沒有在這個 at.deny文件中的使用者,就可以使用 at
at命令的白名單:/etc/at.allow 這個文件,寫在這個文件中的用戶名才能使用 at ,沒有在這個文件中的用戶則不能使用 at(即使沒有寫在黑名單當中也不能使用at命令)
如果兩個文件都不存在,那么只有 root 可以使用 at 這個指令。
注意:作業執行結果是以郵件發送給提交作業的用戶,計劃任務不要有標準輸出,因為都發送到郵件里會造成資源浪費以及大量垃圾郵件的產生
示例:
計劃12點12分執行ls /etc/ 和echo命令
計劃從現在起一分鐘后執行 echo "lala"命令
查看計劃列表
batch命令:batch會讓系統自行選擇在系統資源較空閑的時間去執行指定的任務;所有其他任何特性都與at命令相同
crontab命令:arcontab周期性任務計劃是由cron(crond) 這個系統服務來控制的。cron服務要一直處于運行狀態來保證周期性任務計劃的運行,這個服務要一直運行在后臺,在某個時間點要檢查哪些個周期性任務符合執行條件,而后讓其運行。Linux 系統上面原本就有非常多的周期性任務計劃,這叫做系統性周期任務計劃,主要用于實現系統自身的維護;這類任務應該要在裝完系統之后讓其自動運行的(例如清除tmp目錄下的文件),系統cron任務只能是手動編輯:/etc/crontab文件。因此這個系統服務是默認啟動的。向cron提交作業的方式不同于at,他需要使用專用的配置文件,此文件有固定格式而且是系統性的周期任務計劃,不建議使用文本編輯器直接編輯此文件/etc/crontab;因為大多數系統cron任務,系統在安裝的時候就已經創建完成了 ,我們無需去指定。由于用戶自己也可以進行周期性任務計劃,所以用戶控制周期性計劃任務的命令是(crontab);當用戶使用crontab這個命令來創建周期性任務計劃之后,該項任務就會被紀錄到/var/spool/cron/目錄下,而且是以用戶名來命名文件的,舉例來說,root使用 crontab 后, 他的任務計劃會被記錄到/var/spool/cron/root里頭去!但請注意,不要直接編輯該文件, 因為可能由于輸入語法錯誤,導致任務無法執行,cron服務執行的每一項工作都會被紀錄到/var/log/cron這個登錄文件中,所以,如果你的 Linux 不知道有否被植入木馬時,也可以搜索一下 /var/log/cron 這個登錄文件!
與at命令相同crontab命令同樣用于黑名單和白名單
黑名單:/etc/cron.deny文件,將不可以使用crontab命令的用戶名寫入其中,若未記錄到這個文件當中的用戶,就可以使用crontab。
白名單:/etc/cron.allow文件,將可以使用crontab命令的用戶名寫入其中,若不在這個文件內的用戶則不可使用crontab
用戶使用crontab命令執行周期性任務計劃時首先要確保crond守護進程(daemon)處于運行狀態;centos6和centos7不一樣的確認方式不一樣
centos7使用systemctl status crond.service
如果顯示Active:active(running)則表示服務是運行的:如下圖
centos6使用service crond status 命令
如果回顯crind is running…則表示服務是運行狀態的:如下圖
系統cron的配置格式:/etc/crontab
注意:
(1)每一行定義一個周期性任務,共7個字段
* * * * *:定義周期性時間
user-name:運行任務的用戶身份
command to be executed:任務
(2)此處的環境變量不同于用戶登錄后獲得的環境,因此,建議命令使用絕對路徑,或者自定義PATH環境變量;
(3)執行結果郵件發送給MAILTO指定用戶
用戶cron的配置格式:/var/spool/cron/USERNAME
注意
(1)每行定義一個cron任務,共6個字段
(2)此處的環境變量不同于用戶登錄后獲得的環境,因此,建議命令使用絕對路徑,或者自定義PATH環境變量;
(3)執行結果郵件發送給當前用戶
============================================================
crontab語法格式
crontab[-u user][-l | -e][-i][-s]
-e:編輯任務;
-l:列出所有任務;
-r:移除所有任務;即刪除/var/spool/cron/USERNAME文件
-i:在使用-r選項移除所有任務時提示用戶確認
-u user:root用戶可為指定用戶管理cron任務
]# crontab -e:用戶在使用此命令后會自動進入vim的編輯模式,讓用戶在其中編輯計劃性任務,每個任務單獨成行,編輯完任務以后wq保存退出即可
每項任務的格式都是有六個字段,這六個字段的意義為;
時間表示法:
(1)特定值;
給定時間點有效取值范圍內的值;
注意:day of week和day of month一般不同時使用;
(2)*
給定時間點上有效取值范圍內的所有值;表示“每..”
(3)離散取值:,
在時間點上用于逗號分割的多個值
#,#,#
(4)連續取值-
時間點上使用-連接開頭和結束
#-#
(5)在指定時間點上,定義步長;
/#:#即步長
注意:
(1)指定的時間點不能被步長整除時,其意義將不復存在;
(2)最小時間單位為"分鐘",想完成"秒"級任務,得需要額外借助于其他機制;比如;定義成每分鐘任務:而后利用腳本實現在每分鐘之內(sellp命令),循環執行多次;
常用時間格式:及一些示例
特殊用法;
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
前四行是用來配置 cron 任務運行環境的變量:
SHELL 變量的值指定shell 環境(此處默認為 bash shell);PATH 變量定義用來執行命令的程序路徑;cron 任務的輸出被郵寄給 MAILTO 變量定義的用戶名,如果 MAILTO 變量被定義為空白字符串(MAILTO=""),電子郵件就不會被寄出;HOME 變量可以用來設置在執行命令或腳本時使用的主目錄。
如在 /etc/crontab 文件中run-parts部分所示,它使用 run-parts 腳本來執行存在于 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目錄中的腳本,這些腳本被相應地按照預設時間在每小時、每日、每周、或每月執行。這些目錄中的文件應該是 shell 腳本,并且具有可執行權限(chmod +x filename)。
如果某 cron 任務需要根據調度來執行,而不是每小時、每日、每周、或每月地執行,它可以被添加到/etc/cron.d目錄中。該目錄中的所有文件使用和 /etc/crontab 中一樣的語法。
每次編輯完某個用戶的cron設置后,cron自動在/var/spool/cron下生成一個與此用戶同名的文件,此用戶的cron信息都記錄在這個文件中,這個文件是不可以直接編輯的,只可以用crontab -e 來編輯。cron啟動后每過一份鐘讀一次這個文件,檢查是否要執行里面的命令。因此此文件修改后不需要重新啟動cron服務。
常見cron示例參考
5 * * * * ls 指定每小時的第5分鐘執行一次ls命令
30 5 * * * ls 指定每天的 5:30 執行ls命令
30 7 8 * * ls 指定每月8號的7:30分執行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30執行ls命令
30 6 * * 0 ls 指定每星期日的6:30執行ls命令[注:0表示星期天,1表示星期1,以此類推,也可以用英文來表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每月10號及20號的3:30執行ls命令[注:“,”用來連接多個不連續的時段]
25 8-11 * * * ls 每天8-11點的第25分鐘執行ls命令[注:“-”用來連接連續的時段]
*/15 * * * * ls 每15分鐘執行一次ls命令 [即每個小時的第0 15 30 45 60分鐘執行ls命令 ]
30 6 */10 * * ls 每個月中,每隔10天6:30執行一次ls命令[即每月的1、11、21、31日是的6:30執行一次ls命令 ]
每天7:50以root 身份執行/etc/cron.daily目錄中的所有可執行文件
50 7 * * * root run-parts /etc/cron.daily [ 注:run-parts參數表示,執行后面目錄中的所有可執行文件
第10、20、30分鐘輸出到/tmp/cron1.txt:
10,20,30 * * * * echo "第10、20、30分鐘輸出一次" >> /tmp/cron1.txt
以用戶lzw.me的身份每兩小時就運行某個程序:
0 */2 * * * lzw.me /usr/bin/somecommand >> /dev/null 2>&1
一些注意事項
運行結果以郵件通知給當前用戶;如果拒絕結束郵件;
(1)command > /dev/null
(2)command &> /dev/null
定義COMMAND時,如果命令需要用到%,需要對其轉義;但放置于單引號中的%不用轉義亦可;
anacron系統:
假設計算機沒有一直開機,之前在開機狀態定義的計劃性任務就沒辦法執行,這一情況對筆記本電腦、臺式機、工作站及其它不一直開機的系統很重要,對偶爾要關機的服務器很有用。
anacron 并不是用來取代 crontab 的,anacron 存在的目的就在于我們上頭提到的,在處理非 24 小時一直啟動的 Linux 系統的 crontab 的執行! 以及因為某些原因導致的超過時間而沒有被執行的計劃任務。其實 anacron 也是每個小時被 crond 執行一次,然后 anacron 再去檢測相關的調度任務有沒有被執行,如果有超過期限的計劃任務在, 就執行該計劃任務,執行完畢或無須執行任何計劃任務時,anacron 就停止了。
由于 anacron 默認會以一天、七天、一個月為期去檢測系統未進行的 crontab 任務,因此對于某些特殊的使用環境非常有幫助。舉例來說crontab 大多在每天的凌晨以及周日的早上進行各項任務, 偏偏你又關機了,此時系統很多 crontab的任務就無法進行。 anacron 剛好可以解決這個問題!
那么anacron又是怎么知道我們的系統啥時關機的呢?這就得要使用anacron讀取的時間記錄文件(timestamps)了!
anacron會去分析現在的時間與時間記錄文件所記載的上次執行anacron的時間,兩者比較后若發現有差異,那就是在某些時刻沒有進行crontab啰!此時anacron就會開始執行未進行的 crontab 任務了
anacron的配置文件: /etc/anacrontab,負責執行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly中系統任務。
/etc/cron.hourly/由/cron.d/0hourly執行,簡單來就是,如果你每個周日的需要執行的動作是放置于 /etc/crontab 的話,那么該動作只要過期了就過期了,并不會被抓
回來重新執行。但如果是放置在 /etc/cron.weekly/ 目錄下,那么該工作就會定期,幾乎一定會在一周內執行一次~如果你關機超過一
周,那么一開機后的數個小時內,該工作就會主動的被執行喔!這就是/etc/anacrontab的定義
練習作業
1、每4小時備份一次/etc目錄至/backup目錄中,保存的文件名稱格式為“ etc-yyyy-mm-dd-HH.tar.xz”
0 */4 * * * /bin/tar zvf /etc/ /backup/etc`date +%F-%H-%M`.tar.xz
2、每周2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名如“ messages-yyyymmdd”
0 23 * * 2,4,7 /usr/bin/cp -a /var/log/messages /logs/messages-`date +%F`
3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
0 */2 * * * /usr/bin/cat /proc/meminfo |grep "^[S|M]" >> /tmp/meminfo.txt
4、工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現任何分區利用率高于80%,就執行wall警報
#!/bin/bash # # disk=`df |grep "/dev/sd" |tr -s ' ' "%" |cut -d% -f5 |sort -nr |head -n1` if [ $disk -gt 20 ];then wall "disk is max 20%" exit 1 fi 先編寫以上腳本 0 */4 * * 1-5 /root/scripts/crontab_diskcheck.sh 然后執行crontab -e 編輯如此命令
原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/44669