[Linux Shell學習系列四]Shell命令進階-后台執行命令


1. cron、crontab命令

cron是執行定時計划任務的守護進程。

當系統是多用戶運行級別時,cron進程會從/etc/init.d中自動啟動。cron進程會在目錄/var/spool/cron/contabs/下搜索定時計划任務文件(定時計划任務文件以創建次任務的賬戶名命名),並將找到的這些定時計划任務載入內存。

注意:/var/spool/cron/contabs/中的定時計划任務文件不要用文本編輯器編輯,應當使用crontab命令訪問和更新它們的內容。因為crontab命令可以檢查這些文件中的語法錯誤。

cron進程還會讀取/etc/crontab以及目錄/etc/cron.d下的內容。

cron進程每分鍾喚醒一次,審查所有存儲的定時計划任務,檢查每個命令,看它是否應該在當前時間運行。

另外,cron每分鍾會檢查一次它的池目錄/var/spool/cront/crontabs的修改時間(modtime)是否已經改變。如果修改時間已經改變,cron會檢查所有定時計划任務文件的修改時間,並重新加載那些已經被修改的定時計划任務文件。因此,當定時計划任務文件被修改后,不需要重啟cron守護進程。

注意:使用crontab修改定時計划任務文件時,它會更新池目錄/var/spool/cront/crontabs的修改時間。

 

crontab命令用於創建、修改、刪除和查看定時計划任務。每個用戶可以使用crontab命令創建自己的定時計划任務,生成的計划任務文件將以用戶的賬戶名命名。

定時計划任務文件由每行命令組成,每行有6個字段,由空格或制表符分隔。前五個字段表示運行任務的時間,最后一個字段是任務的命令。

前五個字段的含義依次為:

  • 分鍾:0~59
  • 小時:0~23
  • 日期:1~31
  • 月份:1~12或Jan~Dec
  • 星期:0~6或Sun~Sat,0表示星期日

這五個字段中還可以使用以下特殊字符描述:

  • *星號:匹配所有可能的值,如“0 6 * * *”表示每天6點
  • -連字符:定義一個范圍,比如“0 2 ** 1-5”表示每周一到周五的凌晨2點
  • /斜杠:表示每間隔多少時間,如“*/5 * * * *”表示每5分鍾
  • ,逗號:表示或,如“0 0,6,12,18 * * *”表示每天的0點、6點、12點和18點
$ crontab -l #使用-l選項,可以列出當前用戶的所有定時計划任務,如每分鍾執行一次腳本
*/1 * * * * /home/user1/test/echotime.sh

$ crontab -e #使用-e選項,創建或修改當前用戶的定時計划任務

$ crontab -u user1 -l #使用-u選項,查看指定用戶的定時任務計划
*/1 * * * * /home/user1/test/echotime.sh

$ crontab -r #使用-r選項,移除當前用戶的定時計划任務,不經確認

$ crontab -i -r #使用-i配合-r選項,可以在移除前提示用戶確認
crontab: really delete user1's crontab?

 

2. at命令

 at命令用於安排一個任務在指定的時間運行。可以從標准輸入讀入命令,也可以從指定的文件中讀入,然后在指定的時間運行這些命令。

語法:at [-f file] [-q queue] [OPTION] TIME [DATE]

# date
# at now + 1 minutes #創建一個定時任務
at> date
at> <EOT> #這里使用Ctrl+D
job at [執行時間]

# cat myjobs.txt
/path/to/a/shell-script
/path/to/any/command

# at -f myjobs.txt now + 1 hour #使用-f參數,定時運行文件中的內容
job at [執行時間]

# at -l #使用-l參數,列出當前用戶(非root)所有使用at命令創建的還未運行或正在運行的任務,如果是root用戶,列出所有用戶的任務
1 2013-10-07 05:00 a root

# atq #atp命令與at -l一樣

# atrm 1 #通過-l列出的任務編號,刪除現有的任務

注:上述命令未嘗試

 

3. &控制操作符

字符“&”是Bash內置的用於並行處理進程的一個控制操作符。在命令末尾添加&會在后台運行該命令,將在當前的Shell進程下啟動一個子Shell進程,因此當該命令在后台運行時,可以繼續在此終端輸入並運行其他命令。

語法:command &或script-name &

$ sleep 10 & #將命令放到后台執行
[1] 29281 #顯示這個后台任務的編號(1)及其對應的子進程號(29281)

$ jobs #使用jobs命令,可以查看后台正在運行的任務的信息
[1]+  Running                 sleep 10 & #正在運行

$ jobs #再次使用jobs命令查看
[1]+  Done                    sleep 10 #結束

$ jobs -l #jobs命令使用-l選項,可以列出后台正在運行的任務的進程號等信息
[2]+ 32203 Running                 sleep 10 & #這里的任務編號是2 

$ %2 #使用%+通過jobs查到的任務編號,將指定的任務放到前台運行,並作為當前運行的任務
sleep 10

$ fg 2 #使用fg命令+通過jobs -l查到的任務編號,將指定的任務放到前台運行,並作為當前運行的任務
sleep 10

$ sleep 30 & #后台運行
[3] 5045

$ fg 3 #使用fg命令放到前台運行
sleep 30
^C #這里輸入Ctrl+Z將任務掛起

$ bg 3 #使用bg命令將任務重新放到后台運行
[3]+ sleep 30 &

$ jobs -l
[3]   5045 Running                 sleep 30 &

 

4. nohup命令

nohup命令讓你運行的命令或腳本在你退出系統后繼續在后台運行。

語法:nohup COMMAND [ARG]... &

COMMAND:Shell腳本或命令的名稱

[ARG]:腳本或命令的參數

&:nohup命令不能自動地將任務放在后台運行,必須明確的使用&操作符

$ nohup ./echotime.sh & #使用nohup命令運行一個腳本
[1] 5327 #這里輸出任務編號(1)和后台任務的進程號(5327)
$ nohup: ignoring input and appending output to 'nohup.out' #輸出一行信息,表示腳本運行輸出的所有內容都被寫入到當前目錄下的文件nohup.out中

$ ps -ef|grep 5327 #當退出系統再重新登錄后,還可以查看正在運行的腳本

 

本節結束

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM