linux中計劃任務執行指令碼

weixin_34292959發表於2016-08-27

我使用的是ubuntu14.4,所以在ubuntu中一切正常,在其他linux系統中應該都差不多。

  1 計劃任務,crontab命令選項:
     -u指定一個使用者,
     -l列出某個使用者的任務計劃,
     -r刪除某個使用者的任務,
     -e編輯某個使用者的任務

  2 cron檔案語法:

    分     小時   日       月       星期     命令
         0-59   0-23   1-31   1-12     0-6     command     (取值範圍,0表示週日一般一行對應一個任務)

  可用crontab -e命令來編輯,編輯的是/var/spool/cron下對應使用者的cron檔案,也可以直接修改/etc/crontab檔案
具體格式如下:
       Minute Hour Day Month Dayofweek   command
       分鐘     小時   天     月       天每星期       命令
每個欄位代表的含義如下:
     Minute             每個小時的第幾分鐘執行該任務
     Hour               每天的第幾個小時執行該任務
     Day                 每月的第幾天執行該任務
     Month             每年的第幾個月執行該任務
     DayOfWeek     每週的第幾天執行該任務
     Command       指定要執行的程式

  

  記住幾個特殊符號的含義:

        "*"代表取值範圍內的數字,

        "/"代表"每",

        "-"代表從某個數字到某個數字,

        ","分開幾個離散的數字

 

  3 新增一個計劃任務

    crontab -e 然後新增相應的任務,wq存檔退出。

  4 檢視計劃任務

    檢視排程任務
         crontab -l //列出當前的所有排程任務
         crontab -l -u jp   //列出使用者jp的所有排程任務

  5 例子1,增加一個計劃任務

  * * * * * date > test

  6 重啟cron服務

    service cron restart

  注意:每次修改完crontab後,需要重啟服務。

  可以看到test檔案每秒鐘會進行一次更新。

  

  例子2,寫一個python指令碼,定時執行

  test2.py檔案程式碼如下

#!/usr/bin/python
import time

def fun1():
        lastsec = 4
        with open("test",'a+') as fobj:
                for i in range(2*lastsec):
                        tm = time.strftime("%Y-%m-%d %H:%M:%S")
                        fobj.write(tm+"\n")
                        time.sleep(0.5)

def test():
        fun1()
if __name__=="__main__":
        test()

  要想要執行該檔案,需要新增可執行許可權

  chomd +x test2.py

  新增一個計劃任務

  */2 * * * * /usr/bin/python /home/pc/work/ENV/project/test2.py

  注意:為了安全起見所有的路徑都需要是絕對路徑。

  但是沒有執行,後來上網查詢資料,需要檢視日誌,找了半天沒有,原來是ubuntu系統預設沒有開啟日誌。所以要先開啟日誌,日誌檔案在/var/log/cron.log

  方法:

    1) 修改rsyslog檔案,將/etc/rsyslog.d/50-default.conf 檔案中的#cron.*前的#刪掉;
    2) 重啟rsyslog服務service rsyslog restart
    3) 重啟cron服務service cron restart

  這樣就可以看到日誌了。

8月 27 15:42:01 pc-virtual-machine CRON[10196]: pam_unix(cron:session): session opened for user pc by (uid=0)
8月 27 15:42:01 pc-virtual-machine CRON[10197]: (pc) CMD (/usr/bin/python /home/pc/work/ENV/project/test2.py)

可以看到計劃任務卻是執行了。但是為什麼沒有輸出檔案test呢?

  然後自己手動執行計劃任務中的命令,/usr/bin/python /home/pc/work/ENV/project/test2.py

 

pc@pc-virtual-machine:/var/spool$ /usr/bin/python /home/pc/work/ENV/project/test2.py
Traceback (most recent call last):
File "/home/pc/work/ENV/project/test2.py", line 18, in <module>
test()
File "/home/pc/work/ENV/project/test2.py", line 16, in test
fun1()
File "/home/pc/work/ENV/project/test2.py", line 9, in fun1
with open('test','a+') as fobj:
IOError: [Errno 13] Permission denied: 'test'

 

給我報錯了,仔細一看,原來是自己的指令碼有問題,輸出的 test檔案應該是絕對路徑,不應該是相對路徑,可能是程式不是在指令碼所在的資料夾力執行,所以有可能會產生許可權問題。

所以,經過修改後,test2.py檔案如下

#!/usr/bin/python
import time
import os

def fun1():
        lastsec = 4
    curdir = os.getcwd()
    filename = os.path.join(curdir,"test")
        with open('/home/pc/work/ENV/project/test','a+') as fobj:
                for i in range(2*lastsec):
                        tm = time.strftime("%Y-%m-%d %H:%M:%S")
                        fobj.write(tm+"\n")
                        time.sleep(0.5)

def test():
        fun1()
if __name__=="__main__":
        test()

然後重啟cron服務。

ls
startpy.sh test test2.py

可以看到有了輸出。

more test

2016-08-27 16:52:01
2016-08-27 16:52:02
2016-08-27 16:52:02
2016-08-27 16:52:03
2016-08-27 16:52:03
2016-08-27 16:52:04
2016-08-27 16:52:04
2016-08-27 16:52:05

大功告成!!!

 

linux中將一個指令碼檔案作為一個計劃任務小結,以python指令碼為例:

  1 建立指令碼檔案test.py,在檔案開頭需要加上下面一行

  #!/usr/bin/python

  上面這行的作用是說明使用那個直譯器來執行該檔案,如果不知道python直譯器在哪,可以使用命令which python來檢視

  2 給該檔案新增可執行的許可權

  chmod  +x  test.py

  注意:在指令碼檔案中如果涉及檔案操作,請使用絕對路徑,我就是在這上面掉坑裡了。

  3 新增計劃任務

  crontab -e

  在檔案中追加一行,*/2 * * * * /usr/bin/python /home/pc/work/ENV/project/test.py

  儲存退出,:wq

  4 重啟cron服務

  service cron restart

  結束

 

正常情況下應該是可以執行的,如果有問題,可以按照如下步驟找到問題所在

  檢視cron的log,在/var/log/cron.log,想ubuntu預設情況下是沒有開啟的,所以要自己手動開啟log

  如果有log輸出,說明計劃任務試執行正常的,那就有可能是你配置有問題,自己手動執行一下計劃任務中的cmd命令,像我開始那樣就是由於指令碼本身存在問題(不要使用檔案的相對目錄),如果成功,則說明指令碼的環境變數有問題,具體原因就需要檢視crontab傳送的錯誤郵件了。

 

相關文章