Ubuntu 16.04,html
計劃任務 就是 有(時間)計劃地執行(作)任務,有計劃 包括 定時執行(在哪些時間點執行任務)、按照週期執行(每隔多少時間執行任務)。python
那麼,什麼是任務呢?就是 本身想要乾的事情——基於這臺Ubuntu及其鏈接的網絡(局域網、Internet),本身想幹點什麼。linux
本身想幹的事情,受制於所在Ubuntu所安裝的軟件或命令,這個須要明確。shell
在Ubuntu中,簡單的事情,一條命令就能夠解決了,好比,ls、cd等,而複雜的事情就須要 編寫shell腳本甚至計算機程序 了。vim
不管是 簡單的事情,仍是 複雜的事情,從crontab命令的角度來看,都是 任務,均可覺得其 執行時間 作計劃。網絡
本文介紹下本身今天使用crontab命令作計劃任務的一些經驗。dom
怎麼用crontab命令?ide
簡單的用法能夠在終端輸入crontab --help查看其usage:學習
注意下面的紅色字體部分,其實,crontab命令時沒有--help選項的,由於本身用錯了,因此,系統給出了它的簡單用法。測試
在usage:以後,能夠看到crontab命令的兩種用法。
$ crontab -help crontab: invalid option -- 'h' crontab: usage error: unrecognized option usage: crontab [-u user] file crontab [ -u user ] [ -i ] { -e | -l | -r } (default operation is replace, per 1003.2) -e (edit user's crontab) -l (list user's crontab) -r (delete user's crontab) -i (prompt before deleting user's crontab)
複雜的用法可使用man命令查看:
man crontab、man 5 crontab、man cron
特別說明的是,crontab命令時針對Linux用戶作計劃任務 列表 的,每一個Linux用戶都會有本身的計劃任務 列表,這個計劃任務 列表 能夠經過crontab -u username -e命令進行編輯(實際狀況會更復雜)。
crontab命令涉及到的幾個文件:
-/var/spool/cron目錄,及其下的crontabs目錄
其中的crontabs包含了每一個用戶的計劃任務列表,以用戶的名字命名。固然,有計劃任務的用戶的名字纔會顯示在其中。
其它兩個目錄是給at、batch等計劃任務命令使用的,請自行查找這兩個命令的用法,本文不作介紹。
注意,沒法使用cd或cd命令進入crontabs。
/var/spool/cron$ ls
atjobs atspool crontabs
-/etc/目錄下包含cron的文件及目錄
其中的crontab包含了root用戶的計劃任務,能夠在其中添加本身的計劃任務,,最開始本身也是這麼作的,後來,改成在當前用戶的根目錄中新建包含計劃任務的文件。
/etc$ ls | grep cron
cron.d
cron.daily
cron.hourly
cron.monthly
crontab
cron.weekly
-/etc/init.d/cron腳本
用來控制crontab服務的啓停等。
/etc$ service cron
* Usage: /etc/init.d/cron {start|stop|status|restart|reload|force-reload}
還可使用whereis crontab、whereis cron來查看二者所在位置:
~$ whereis crontab crontab: /usr/bin/crontab /etc/crontab /usr/share/man/man1/crontab.1.gz /usr/share/man/man5/crontab.5.gz ~$ whereis cron cron: /usr/sbin/cron /etc/cron.weekly /etc/cron.hourly /etc/cron.monthly /etc/cron.d /etc/cron.daily /usr/share/man/man8/cron.8.gz
注意,在Windows 10家庭中文版上安裝的Bash on Ubuntu on Windows中,/etc/init.d中也是有cron腳本的,可是,此腳本沒有被安裝,即沒有 隨機啓動。安裝後會怎樣呢?在某些/etc/rc*.d/目錄中會出現cron腳本的軟鏈接。
說了不少,下面開始本身的實踐介紹。
1.使用/etc/crontab文件添加 簡單計劃任務——命令
進入/etc目錄,使用sudo vim crontab打開文件:默認狀況下,只有屬於root的計劃任務。
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) #
在最後一行下面,添加一些其它用戶的計劃任務——格式參考root用戶的:
每一個5分鐘,將執行date獲取的時間附加到用戶主目錄下的filename.txt文本文件中。
*/5 * * * * username date >> /home/username/filename.txt
說明,參考連接中有更多關於計劃任務的時間的設置介紹;
說明,在計劃任務列表文件中,除了配置SHELL、PATH環境變量外,還能夠配置MAILTO、HOME環境變量;其中,MAILTO配置爲空("")時,表示執行計劃任務時不發送郵件,不然,一旦執行了計劃任務,就會發送郵件到/var/mail/username中——在用戶username在終端執行命令時,若是有新郵件產生,會提示用戶——You have new mail in /var/mail/username!在剛開始學習crontab命令時,能夠經過這個郵件文件查看到不少錯誤信息,進而糾正本身添加的計劃任務。
上面的計劃添加完畢後,不用重啓cron服務,由於其會每隔一分鐘檢查一次是否有計劃任務要執行——會不會太快、是否須要調整?
若計劃任務執行正常,用戶能夠在主目錄的filename.txt中看到date的信息(下面是示例,簡單計劃任務的示例仍是很好造的):
$ cat filename.txt Sun Aug 26 12:28:01 CST 2018 Sun Aug 26 12:33:01 CST 2018 Sun Aug 26 12:38:01 CST 2018
2.使用/etc/crontab文件添加 複雜計劃任務——腳本
腳本,這裏單指shell腳本。
說明,對於Python等腳本文件,應該也是能夠執行的,不過,後者能夠歸屬爲上面第一種狀況——python3 python腳本,,未實踐之推測。
shell腳本能夠簡單,也能夠複雜。鑑於孤水平有限,就作寫了一些簡單的shell腳本進行測試——進入本身的Python虛擬化目錄、激活虛擬化目錄、執行其中的爬蟲程序,最後把計劃任務執行時間寫到主目錄下的文件中。
參考:Shell腳本教程
創建shell腳本後,使用chmod +x filename.sh給腳本添加 可執行 權限。
而後,使用腳本文件的絕對路徑——/home/username/filename.sh——替換掉上面的計劃任務中的date開始的部分:
*/5 * * * * username /home/username/filename.sh
就這樣,好啦!下面就等着腳本按照計劃執行吧!
這樣看來,其實腳本也是一個命令。
固然,在參考連接中還有更多關於如何修改/etc/crontab的介紹,有須要的話還需細讀。
3.在用戶主目錄下創建本身的計劃任務列表文件並執行其中的計劃任務
將/etc/crontab拷貝到用戶主目錄下,刪除其中的屬於root的計劃任務,而後添加用戶的計劃任務。
千萬注意!在添加的計劃任務裏面不須要添加用戶名,即時間計劃後面直接就是 命令或者腳本,不然,計劃任務沒法執行,以下:
失敗:*/5 * * * * username /home/username/filename.sh
成功:*/5 * * * * /home/username/filename.sh
怎麼知道這個錯誤緣由的呢?經過/var/mail/username文件,其中會顯示以下信息:
/bin/sh: 1: username: not found
說的有些超越了,回到上面寫好了計劃任務列表文件,如今,添加此文件到用戶的計劃任務中——默認狀況下,用戶是沒有計劃任務的。添加方法:
crontab crontab-filename
添加時,crontab會檢查文件是否符合計劃任務的格式,如果格式不符合,則報錯,且添加失敗。總之,計劃任務列表文件不是隨隨便便的一個文本文件,有格式要求,這也是孤拷貝/etc/crontab再進行修改的緣由。
添加成功後,使用crontab -l能夠查看當前用戶的計劃任務列表,使用crontab -e能夠對其編輯,使用crontab -r能夠刪除(沒用過)。
就本身目前所知,每個用戶只能有一個計劃任務列表,在添加完畢後——從無到有,/var/spool/cron/crontabs/目錄下會多了一個以用戶名命名的文件——即其計劃任務列表。
說明:在調試階段,本身沒有設置MAILTO,此時會有郵件產生,在計劃任務設置正確後,本身將MAILTO設置爲了空(""),不然,爬蟲程序產生的不少結果都會出如今郵件中。
本身的難點:HELP!!!
在當前用戶沒有配置計劃任務時,不知道怎麼操做crontab -e打開的交互框。
後記
經過使用crontab命令,孤將本身的爬蟲程序設置爲了自動運行了,輕鬆很多啊!
不過,本身是達到了基本能用crontab命令的階段了吧——實現了本身須要的功能,對於更高級的應用,還須要更多的閱讀和實踐,好比,本身對/etc/下crontab相關的daily、hourly、monthly等不是很熟悉,本身對cron.allow和cron.deny也不熟悉……
要玩轉Linux,Shell腳本真的很重要!Linux用的怎麼樣,很重要的一個衡量標準就是Shell的使用水平吧!
參考連接