利用shell指令碼實現計畫任務功能 V1 2

2022-02-28 02:09:33 字數 2312 閱讀 6205

2013.05.10  mytask 1.2

主程式休眠時間分成若干小的時間片斷分段休眠,避免長時間的休眠不能及時響應系統訊號。

2013.05.07 mytask 1.1

昨天發布了mytask1.0 版後(利用shell指令碼實現計畫任務功能),一直在想著如何解決那個最後的遺留問題"每個任務指令碼中宣告的函式名必須唯一不能重複,否則會導致任務函式覆蓋。",無意間自問了一句為什麼不能像crontab那樣直接呼叫指令碼和命令呢?這一問才讓自己回憶起來,之所以用function封裝任務是因為早期的版本是把任務和主程式寫在乙個指令碼裡的,後來多次修改後將任務從主程式裡分離了出來,但寫到function中的設計一直沒有變,不合理的設計也就不知不覺變得合理了.

問題想清楚後開始重新調整程式, 首先將所有的任務**直接寫到每個指令碼中,取消函式包裝.然後把任務初始化宣告剝離出來形成單獨的任務配置檔案,這樣程式間的耦合度下降,結構也清楚多了.最後還加入了動態過載任務配置檔案的功能,使mytask程式使用起來更方便.

一、mytask 實現功能:

1、多工併發執行,不會互相影響,採用鎖機制避免單個任務的重疊執行。

2、每個任務以單獨指令碼形式儲存,相互獨立。

3、支援起始執行時間,如"2013/05/08"、"13:30"或「now」。並且支援給起始執行時間的修正值,比如"now+5m"表示當前時間的5分鐘後執行(另外還實現了負數修正值,比如-1h,現在覺得這個功能挺無聊的)。

4、支援多種型別的執行週期設定,包括秒、分、時、天、周、月、年還有一次性任務。

5、會根據任務執行間隔,自動設定休眠時間,主程式占用資源極小。

6、任務可以是shell指令碼,也可以是直接的linux命令。

7、獨立的任務配置檔案,集中定義任務內容、起始時間和執行間隔。(個人感覺比crontab的設定更直觀)

8、支援執行時過載任務配置檔案,無需重啟主程式就可以將調整後的任務加入計畫。

二、任務配置檔案說明:

預設的任務配置檔案為主程式目錄下的mytask.conf

每一行配置對應乙個計畫任務,配置項之間以逗號分隔,任務配置定義如下:

《任務內容》,《起始執行時間》,《執行週期》

1、任務內容,可以是指令碼檔案、命令等。

要注意寫全檔案或命令的路徑,可以使用全域性變數$basedir代表主程式所在目錄。

複雜的命令建議儲存在指令碼檔案中。

2、起始執行時間分兩部分。

第一部分為初始時間,格式為"yyyy/mm/dd hh:mm:ss"也可以是時間值片斷,例如:"2013/03/05"、"03/05"、「03/05 21:30」、"21:30"或當前時間"now"。

第二部分為修正時間,格式為"+時間單位"或「-時間單位」,意思為在初始時間的基礎上做進一步的時間修正。

例如:"+5s"、"-10m"等。

時間的單位區別大小寫,具體定義如下:

y=年、m=月、d=日、h=時、m=分、s=秒、w=星期

3、執行週期即為任務函式執行的間隔時間,取值與修正時間類似,只是取消了+-號,如果值為不帶單位的0則表示只執行一次。

任務定義示例如下:

#在凌晨零點開始執行,每隔1天執行一次。

$basedir/tasks/backdb.sh,00:00,1d

#在當前時間的2分鐘後開始執行,每隔1個月執行一次。

$basedir/tasks/test1.sh,now+2m,1m

#在5月12日14點30開始執行,每隔1小時執行一次。

/home/lykyl/sp.sh,5/12 14:30,1h

#在15:50點開始執行,每隔30秒執行一次。

$basedir/tasks/test3.sh,15:50,30s

#啟動即開始執行,每隔1分鐘執行一次。

touch /tmp/ohyeah,now,1m

#在當前時間的1小時後開始執行,只執行一次。

$basedir/tasks/test5.sh,now+1h,0

三、程式控制命令

1、啟動

nohup ./mytask.sh &

2、退出

kill -15 `cat ./mytask.pid`

kill -sigusr1 `cat ./mytask.pid`

四、題外話

程式執行原理和1.0版基本一致,另外原始碼中也加入了必要的註解,因此也就沒必要在這兒重複列表。有興趣的可以點選瀏覽前文《利用shell指令碼實現計畫任務功能》,包括開發背景、思路和主要**。

這個程式是因為工作需要而編寫的,目前已經在工作環境穩定執行,**本身並不複雜,shell剛剛入門的朋友完全可以當做練手自己試著邊執行程式邊理解**。語法上的問題,可以參考我的另一篇博文《linux bash script簡明手冊》。

shell 指令碼控制與計畫任務

可以使用nice和renice調整指令碼優先順序 避免出現不可控的死迴圈 fork炸彈 捕獲訊號指令碼的編寫 訊號指令碼 bin bash 捕獲15號訊號 trap echo sig 15 15 捕獲2號訊號 trap echo sig 2 2計畫任務 讓計算機在指定的時間執行程式 root izb...

指令碼練習 計畫任務管理

bin bash read p please input a filename file if e file then echo file is not exits elif r file a w file then echo user can t read and write file else ...

利用計畫任務實現遊戲監控

任務計畫,又稱為計畫任務,是windows中可以定時執行預定任務的服務。利用任務計畫,可以讓計算機按照主人的計畫執行相應的程式 指令碼或者文件,如同乙個可以自動執行任務的 定時器 windows 7中,計畫任務面板所在的位置為 windows all programs accessories sys...