Linux創建定時任務

在Linux下,經常需要定期的執行一些腳本從而來實現一些功能。在Linux下我們用crontab來實現定期的執行腳本這個功能,下面就介紹一下crontab的使用。以及我遇到的一些問題

1. crontab的使用說明

  1. crond 是linux用來定期執行程序的命令。當安裝完成操作系統之後,默認便會啓動此任務調度命令。crond命令每分鐘會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。而linux任務調度的工作主要分爲以下兩類:

    • 系統執行的工作,比如垃圾清理,備份
    • 用戶自定義的工作,比如每5分鐘執行一次腳本
  2. crontab是UNIX系統下定期執行任務的觸發器。用戶把要定期執行的任務記錄在這個文件下面,然後crond定期的去檢查這個定期執行列表,有要執行的工作時便自動執行。
    通過man crontab可以查看到下面的信息:

    • /etc/crond.allow 表示的是允許使用crontab的用戶列表
    • /etc/crond.deny 表示的是不允許使用crontab的用戶列表
  3. crontab常用的幾個命令格式

    • crontab -l        //顯示用戶的crontab文件的內容
    • crontab -e        //編輯用戶的crontab文件的內容
    • crontab -r        //刪除用戶的crontab文件
  4. crontab文件的基本格式如下所示

*    *    *    *     *   command
分   時   天    月    周    命令

每列表示意義:

  • 第一個表示的是分鐘1~59分鐘,默認表示的是每分鐘都執行,x-y表示的是x~y這段每分鐘都執行,*/n表示每n分鐘執行一次,x,y,z表示的是x,y,z分鐘都執行。

  • 第二個表示的是小時1~23小時,默認表示的是每小時都執行,x-y表示的是x~y這段每小時都執行,*/n表示每n小時執行一次,x,y,z表示的是x,y,z小時都執行。

  • 第三個表示的是天1~31,默認表示的是每天都執行,x-y表示的是x~y這段每天都執行,*/n表示每n天執行一次,x,y,z表示的是x,y,z天都執行。

  • 第四個表示的是月1~12,默認表示的是每個月都執行,x-y表示的是x~y這個段每月都執行,*/n表示每n分鐘執行一次,x,y,z表示的是x,y,z天都執行。

  • 第五個*表示的是周0~6(0表示周天),默認週一~周天都執行,x-y表示周x~周y每天都執行。

crontab文件的一些例子

  • 30 21 * * * /usr/local/etc/rc.d/lighttpd restart //表示每天21:30重啓apache

  • 45 4 1 10 22 * * /usr/local/etc/rc.d/lighttpd restart //表示每月1,10,22號4:45重啓apache

  • 0 30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart //表示每天18 : 00至23 : 00之間每隔30分鐘重啓apache

  • * * 1 * * * /usr/local/etc/rc.d/lighttpd restart //表示每一小時重啓apache

  • * 5 * * * * /usr/local/etc/rc.d/lighttpd restart //表示每5分鐘重啓apache

2. 具體例子

  1. 首先我在/home/chenguolin/tmp/ 創建一個shell腳本名爲s.sh。注意腳本內部的路徑使用絕對路徑。這個腳本的功能就是把當前的日期輸出重定向到當前目錄下的out文件

  2. 然後設置每2分鐘執行一次這個腳本,>/dev/null 2>&1。原因是因爲系統會在每次執行完任務之後就發一個郵件告訴用戶,通過這個操作可以把信息全部重定向到/dev/null中,/dev/null這個文件類似回收站過一段時間系統自動清理。
    * 2 * * * * sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1
    然後發現過了n個2分鐘,out文件根本就沒有輸出。

  3. 在谷歌/百度無果之後,問了同事,得到了原因是因爲crontab可能有時候沒有辦法執行用戶家目錄下面的兩個文件,分別是.bashrc和.bash_profile
    這兩個文件的作用如下:

    • .bashrc作用是用於你的bash shell的bash信息,當登錄時及每次打開新的shell時,該文件被讀取;

    • .bash_profile作用是每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件,因此我們要手動在crontab文件中添加source /home/chenguolin/.bashrc && source /home/chenguolin/.bash_profile

    • source的作用是當前bash環境下執行命令,而scripts是啓動一個子shell來執行命令。這樣如果把設置環境變量(或alias等等)的命令寫進scripts中,就只會影響子shell,無法改變當前的BASH,所以通過文件(命令列)設置環境變量時,要用source 命令。
      因此crontab文件中變成
      * 2 * * * * source && /home/chenguolin/.bashrc && source /home/chenguolin/.bash_profile && sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1

  4. 發現可以定時的執行腳本。
    如果還不行,那隻能通過查找log來查錯。非ubuntu的Linux crond的日誌文件保存在/var/log下

3. ubuntu下使用crontab定時執行腳本

注意下幾個問題:

  1. ubuntu下crontab的服務程序是cron,並且默認cron服務的log是沒有的,我們必須手動開啓

    • sudo vim /etc/rsyslog.d/50-default.conf
    • 找到cron.*那一行把註釋去掉
    • 然後重啓cron服務 sudo service cron restart
    • 這樣就可以在/var/log裏面發現有cron的日誌文件了,我們就可以通過查看日誌文件找到問題所在
  2. ubuntu下,用戶家目錄下是沒有.bash_profile文件的,並且會自動去執行.bashrc文件,只要寫成下面這樣即可

    • * 2 * * * * sh /home/chenguolin/tmp/s.sh >/dev/null 2>&1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章