linux中計畫任務執行指令碼

2021-09-08 19:11:58 字數 4796 閱讀 9288

我使用的是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

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服務。

lsstartpy.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

大功告成!!!

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計畫任務通過執行指令碼

linux計畫任務通過執行指令碼備份xampp安裝的mysql資料庫 鄧強 1.首先編輯計畫任務 vim etc crontab 加入以下 mysqldump mysqlbases to this file 0 2 root usr bin mysqlbak 這是設定每天2點定時執行 mysqlba...

MySQL定時執行指令碼 計畫任務 例項

具體 在mysql中我們可以直接進行一些引數設定讓它成定時為我們執行一些任務了,這個雖然可以使用windows或者linux中的計畫任務實現,但是mysql本身也能完成。檢視event是否開啟 如下 複製 show variables like sche 將事件計畫開啟 如下 複製 set glob...

MySQL定時執行指令碼 計畫任務 命令例項

檢視event是否開啟 複製 如下 show variables like sche 將事件計畫開啟 複製 如下 set global event scheduler 1 建立儲存過程test 複製 如下 create procedure test begin update examinfo set...