Ubuntu 16.04,
計劃任務 就是 有(時間)計劃地執行(做)任務,有計劃 包括 定時執行(在哪些時間點執行任務)、按照週期執行(每隔多少時間執行任務)。
那麼,什麼是任務呢?就是 自己想要乾的事情——基於這臺Ubuntu及其連接的網絡(局域網、Internet),自己想幹點什麼。
自己想幹的事情,受制於所在Ubuntu所安裝的軟件或命令,這個需要明確。
在Ubuntu中,簡單的事情,一條命令就可以解決了,比如,ls、cd等,而複雜的事情就需要 編寫shell腳本甚至計算機程序 了。
無論是 簡單的事情,還是 複雜的事情,從crontab命令的角度來看,都是 任務,都可以爲其 執行時間 做計劃。
本文介紹下自己今天使用crontab命令做計劃任務的一些經驗。
怎麼用crontab命令?
簡單的用法可以在終端輸入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的使用水平吧!
參考鏈接