自學Linux Shell15.2-做業控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab)

點擊返回 自學Linux命令行與Shell腳本之路html

15.1-做業控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab)

1  控制做業

1.1查看做業 (jobs命令)

jobs命令能夠查看shell處理的當前做業。
jobs命令的參數:
算法

  • -l 列出進程的PID及做業號
  • -n 只列出上次shell發出的通知後改變了狀態的做業
  • -p 只列出做業的PID
  • -r 只列出運行中的做業
  • -s 只列出已中止的做業

以上解析:shell

腳本使用$$變量顯示Linux系統分配給腳本的PID,而後進入循環,每次迭代間隔5秒。經過命令行節目啓動第一個腳本,而後使用Ctrl+Z組合鍵中止它。
使用&符號之後臺進程方式啓動另外一個做業,並將該腳本的輸出重定向到一個文件,以便不會在監視器上顯示。
做業啓動以後,使用jobs命令查看分配給shell的做業。jobs命令便可以顯示中止的做業也能夠顯示做業狀態,還包括做業編號以及做業中使用的命令。

jobs輸出中輸出中的加號和減號
緩存

  • 帶有加號的做業被視爲默認做業。若是命令行沒有指定做業編號,則它應該是任何做業控制命令引用的做業。
  • 帶有減號的做業實在處理完當前默認做業以後將成爲默認做業的做業。
  • 某一時間點,只能有一個帶有加號的做業,也只能有一個帶有減號的做業,不管shell中運行了多少做業。

2.重啓中止的做業 (bg命令)

在bash做業控制下,可以之後臺進程或前臺進程的形式從新啓動任何中止的做業。前臺進程將控制正在處理的終端,所以謹慎使用特性。
要之後臺模式從新啓動做業,可使用帶有做業編號的bg命令。
bg命令格式:bg 做業編號bash

 

之後臺模式從新啓動做業,出現命令行界面提示符,可以繼續處理其餘命令。
要之前臺模式從新啓動,可使用帶有做業編號的fg命令:fg 做業編號服務器

 

2  調度優先級做業

在多任務操做系統中,內核負責爲系統中運行的每一個進程分配CPU時間。實際上,CPU中一次只能運行一個進程,所以內核輪流向每一個進程分配CPU時間網絡

默認狀況下,從shell啓動的全部進程在Linux系統上的調度優先級都相同。調度優先級是內核相對其餘進程分配個某一個進程的CPU時間量。ide

調度優先級是一個整數值,從-20(最高優先級)到+20(最低優先級)。默認狀況下,bash shell啓動全部優先級爲0的進程。這代表只須要一點處理時間的簡單腳本與須要運行幾個小時的複雜數學算法獲得的CPU時間段相同。工具

有時須要更改特定命令的優先級,可能要下降優先級以減小它佔用的CPU資源,還可能要提升優先級,以得到更多的處理時間。url

2.1 nice命令

nice命令可在啓動命令時設置它的調度優先級

  • 要讓命令在更低的優先級下運行,只須要使用nice -n命令行選項指定一個新的優先級水平
  • 必須將nice命令和要啓動命令放置於同一行
  • nice命令阻止普通系統用戶來提升命令的優先級
  • 也能夠經過 nice 破折號後面跟上優先級 設定

 

2.2 renice命令

renice命令能夠更改已經在系統中運行的命令優先級。它可以指定運行進程的PID以更改優先級

renice命令自動更新運行程序的調度優先級。renice命令有以下幾個限制:

  • 只能對擁有的進程使用renice命令
  • 只能使用renice命令將進程調至更低的優先級
  • 根用戶可使用renice命令將任何進程調至任何優先級。
  • 若是要徹底控制運行進程,則須要以根用戶登陸。

3  定時運行做業

在處理腳本時,總會遇到須要在給定時間運行腳本。Linux系統提供3中方式在預約時間運行腳本:at命令、batch命令、cron表格。每種方法使用不一樣的技術調度運行腳本的時間和頻率。

3.1 at命令來計劃執行命令

at命令容許指定Linux系統運行腳本的時間。at命令將做業提交到一個隊列,並指示shell在什麼時候運行該做業。另外一個命令atd之後臺模式運行,並檢查做業隊列以運行做業。大部分Linux發行版均可以在啓動時自動啓動該特性。
atd命令檢查系統上的特殊目錄,以便運行使用at命令提交的做業。默認狀況下,atd命令每隔60秒檢查一次該目錄。若是存在做業,atd命令檢查運行做業的時間。若是時間與當前時間匹配,則atd命令將運行該做業。

3.1.1  at命令格式   at [-f filename] time
默認狀況下,at命令將STDIN的輸入提交到隊列。可使用-f參數指定用於讀取命令的的文件名(腳本參數)。
time參數指定Linux系統運行做業的時間。at命令能夠識別各類時間格式

  • 標準的小時和分鐘格式,好比10:15
  • AM/PM指示符,好比10:15PM
  • 具體指定的時間,好比now、noon、midnight、teatime(4PM)

除了指定運行做業的時間以外,還能夠包括具體的日期,可使用各類格式的日期

  • 標準的日期格式,好比:MMDDYY、MM/DD/YY、DD.MM.YY
  • 文本日期格式,好比Jul四、Dec 25,沒有年份也能夠
  • 還能夠指定時間增量:Now +25 minutes、10:15PM tomorrow、10:15 +7days

使用at命令時,做業將提交到做業隊列中。
做業隊列保存at命令提交的做業以便處理。有26種不一樣的做業對壘可用於不一樣的優先級水平。使用小寫字母a到z引用做業隊列。
默認狀況下,全部的at做業都提交到做業隊列a,即優先級最高的隊列。若是但願以較低的優先級運行做業,則可使用-q參數指定字母。

參數:

  • -V : 印出版本編號 
  • -q : 使用指定的佇列(Queue)來儲存,at 的資料是存放在所謂的 queue 中,使用者能夠同時使用多個 queue,而 queue 的編號爲 a, b, c... z 以及 A, B, ... Z 共 52 個 
  • -m : 即便程序/指令執行完成後沒有輸出結果, 也要寄封信給使用者 
  • -f file : 讀入預先寫好的命令檔。使用者不必定要使用交談模式來輸入,能夠先將全部的指定先寫入檔案後再一次讀入 網絡應用
  • -l : 列出全部的指定 (使用者也能夠直接使用 atq 而不用 at -l) 
  • -d : 刪除指定 (使用者也能夠直接使用 atrm 而不用 at -d) 
  • -v : 列出全部已經完成但還沒有刪除的指定 

3.1.2 獲取做業輸出

做業在Linux系統運行時,沒有與該做業關聯的監視器。Linux使用提交做業的用戶的電子郵箱地址做爲STDOUT和STDERR。任何以STDOUT和STDERR爲目的的輸出都將經過郵件系統發送給用戶。
若是系統沒有安裝at、mail命令使用命令:sudoapt-get install at、sudo apt-get install mail。進行安裝。

 

 

 3.1.3 列出等待的做業 (atq 後者at -l)

 參看系統哪些做業在等待。 顯示做業號、系統運行該做業的日期和時間以及所在的做業隊列。

 3.1.4 刪除做業(atrm 後者at -d)

 

3.2  按期執行做業命令

Linux系統使用cron程序調度需按期運行的job。corn程序在後臺運行,它從特殊表格(corn表格)中查找須要調度運行的做業。

3.2.1 cron表格

cron表格使用特殊格式指定做業運行時間。cron表格的格式以下:

         min  hour  dayofmonth  month  dayofweek  command

cron表格能夠將條目指定爲具體的值、必定範圍的值(如 1-5)或通配符(*)。例如,若是但願天天10:15運行命令,可使用如下corn表格項:15 10 * * * command。

dayofweek項能夠是3字符的文本值(mon、tue、wed、thu、fri、sat、sun),也能夠是數字:0標識星期天,6表示星期六。

dayofmonth項指定每月的日期值(1-31)

PS:
由於每月份不一樣,因此如何設置一個命令在每月的最後一天執行呢?
一種經常使用的方法是添加:if-then語句,該語句使用date命令檢查明天是不是1號:

         00 12 * * * if [ `date +%d -d tomorrow` =01  ] ;  then ; command

經過if判斷明天是否爲01,若是是則執行命令。這將在天天的12點查看本日是不是該月的最後一天,若是是,它將運行命令。

命令列表必須制定要運行的命令或shell腳本的完整路徑名。能夠根據須要添加任何命令行參數或者重定向符號。  

cron程序使用提交做業的用戶帳戶運行腳本。所以必須擁有相應的權限才能訪問命令行列表中的指定的命令和輸出文件。

3.2.2  構建cron時間表

每一個系統用戶均可以擁有本身的cron表格以及運行安排好的做業。Linux提供crontab命令處理cron表格。

  • -e:編輯該用戶的計時器設置;
  • -l:列出該用戶的計時器設置;
  • -r:刪除該用戶的計時器設置;
  • -u<用戶名稱>:指定要設定計時器的用戶名稱。

Linux下的任務調度分爲兩類:系統任務調度用戶任務調度

系統任務調度:系統週期性所要執行的工做,好比寫緩存數據到硬盤、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。

前四行是用來配置crond任務運行的環境變量

  •    第一行SHELL變量指定了系統要使用哪一個shell,這裏是bash
  •    第二行PATH變量指定了系統執行命令的路徑
  •   第三行MAILTO變量指定了crond的任務執行信息將經過電子郵件發送給root用戶,若是MAILTO變量的值爲空,則表示不發送任務執行信息給用戶
  •   第四行的HOME變量指定了在執行命令或者腳本時使用的主目錄。

用戶任務調度:用戶按期要執行的工做,好比用戶數據備份、定時郵件提醒等。用戶可使用 crontab 工具來定製本身的計劃任務。全部用戶定義的crontab文件都被保存在/var/spool/cron目錄中。其文件名與用戶名一致,使用者權限文件以下:

1 /etc/cron.deny     該文件中所列用戶不容許使用crontab命令
2 /etc/cron.allow    該文件中所列用戶容許使用crontab命令
3 /var/spool/cron/   全部用戶crontab文件存放的目錄,以用戶名命名

crontab文件的含義:用戶所創建的crontab文件中,也就是cron表格。(從新介紹一下)
每一行都表明一項任務,每行的每一個字段表明一項設置,它的格式共分爲六個字段,前五段是時間設定段,第六段是要執行的命令段,格式以下:

1 minute   hour   day   month   week   command     順序:分 時 日 月 周

其中:

  • minute: 表示分鐘,能夠是從0到59之間的任何整數。
  • hour:表示小時,能夠是從0到23之間的任何整數。
  • day:表示日期,能夠是從1到31之間的任何整數。
  • month:表示月份,能夠是從1到12之間的任何整數。
  • week:表示星期幾,能夠是從0到7之間的任何整數,這裏的0或7表明星期日。
  • command:要執行的命令,能夠是系統命令,也能夠是本身編寫的腳本文件。

在以上各個字段中,還可使用如下特殊字符:

  • 星號(*):表明全部可能的值,例如month字段若是是星號,則表示在知足其它字段的制約條件後每個月都執行該命令操做。
  • 逗號(,):能夠用逗號隔開的值指定一個列表範圍,例如,「1,2,5,7,8,9」
  • 中槓(-):能夠用整數之間的中槓表示一個整數範圍,例如「2-6」表示「2,3,4,5,6」
  • 正斜線(/):能夠用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線能夠和星號一塊兒使用,例如*/10,若是用在minute字段,表示每十分鐘執行一次。

每1分鐘執行一次command

1 * * * * * command

 每小時的第3和第15分鐘執行

1 3,15 * * * * command

在上午8點到11點的第3和第15分鐘執行

1 3,15 8-11 * * * command

每隔兩天的上午8點到11點的第3和第15分鐘執行

1 3,15 8-11 */2 * * command

每一個星期一的上午8點到11點的第3和第15分鐘執行

1 3,15 8-11 * * 1 command

每晚的21:30重啓smb 

1 30 21 * * * /etc/init.d/smb restart
每個月一、十、22日的4 : 45重啓smb 
1 45 4 1,10,22 * * /etc/init.d/smb restart
每週6、週日的1:10重啓smb
1 10 1 * * 6,0 /etc/init.d/smb restart
天天18 : 00至23 : 00之間每隔30分鐘重啓smb 
1 0,30 18-23 * * * /etc/init.d/smb restart
每星期六的晚上11:00 pm重啓smb 
1 0 23 * * 6 /etc/init.d/smb restart
每一小時重啓smb 
1 * */1 * * * /etc/init.d/smb restart
晚上11點到早上7點之間,每隔一小時重啓smb
1 * 23-7/1 * * * /etc/init.d/smb restart
每個月的4號與每週一到週三的11點重啓smb 
1 0 11 4 * mon-wed /etc/init.d/smb restart
一月一號的4點重啓smb
1 0 4 1 jan * /etc/init.d/smb restart

3.2.3  瀏覽cron目錄

有4個基本目錄 hourly、daily、monthly、weekly

若是須要腳本天天運行1次,只要將腳本複製到daily目錄,cron就會天天執行一次。

3.2.4 anacron程序

使用cron程序存在的惟一一個問題是,它假定Linux系統天天運行24小時,每週運行7天。只有在服務器環境中運行Linux時才能發生這種狀況。

若是在使用cron程序調度做業時Linux系統處於關閉狀態,則做業將沒法運行。cron程序沒法再系統打開後從新運行錯過的做業。

anacron程序使用時間戳肯定調度的做業是否在正確的時間間隔運行。若是它肯定某個做業錯過了調度的運行時間,它將自動儘快的運行該做業。

該特性對於執行日誌維護的腳本很是有用。若是系統在應該運行腳本時老是關機,則日誌文件將得不到清理,文件大小可能會不斷增大。使用anacron能夠保證日誌文件至少在每次系統啓動的時清理一次。

anacron程序使用本身的表格(一般位於/etc/anacrontab)指定做業。在大部分Linux發行版本,該表格僅供根用戶使用。

anacron表格的格式:period delay identifiercommand

  • period項定義做業應該間隔多久運行一次,一天爲單位。
  • delay項指定在anacron程序肯定應該運行一個命令以後須要多長時間纔會實際運行該命令。該選項能夠爲不一樣的命令設置不一樣的延時,以防止全部命令在一打開Linux系統時運行。
  • command條目包含了run-parts程序和一個cron腳本目錄名。
  • identifier項是一個惟一的非空字符串,能夠惟一地標識日誌消息和錯誤電子郵件中的做業。
  • anacron不會運行位於/etc/cron.hourly的腳本,這是由於不會去處理執行時間需求小於一條的腳本。
相關文章
相關標籤/搜索