1. 程式人生 > >Linux中計劃任務執行腳本crontab-簡潔版

Linux中計劃任務執行腳本crontab-簡潔版

error ESS CA lin 調度 pytho 可執行 too 用戶

我使用的是ubuntu16,所以在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發送的錯誤郵件了。

Linux中計劃任務執行腳本crontab-簡潔版