問題描述:設定在定時任務中的指令碼一定要注意防止指令碼重複執行,要不然會帶來一些想象不到的結果。
方式一:使用鎖定檔案的方式來進行防止指令碼重複執行,類似資料庫socket檔案,但是這種情況有一種弊端就是,如果指令碼因為某些原因退出,但是lock檔案沒有被清理掉,就會導致下一次的指令碼執行失敗
# get script name script_name=$(basename -- "$0") # get script lock file lock_file="/tmp/$script_name.lock" # Check if script is run repeatedly if [ -f $lock_file ]; then echo "`date '+%Y-%m-%d %H:%M:%S'` Another instance of $script_name is already running. Exiting." | tee -a $mylogfile exit 1 else touch $lock_file fi
# 程式執行體 # Delete scripts lock file find $lock_file -delete 2>&1 | tee -a $mylogfile
方式二:使用過濾指令碼程序個數的方式判斷指令碼是否正在執行,這種方式要注意在指令碼頭一定要加上#!/bin/bash,否則系統可能會識別成為一個程式執行體,並不是一個指令碼,導致過濾的時候有問題
#!/bin/bash
check_scripts() { # get script name script_name=$(basename -- "$0") # get script counts running_scripts=$(pgrep -fc "$script_name") # check the number of scripts if (( running_scripts > 1 )); then echo "`date '+%Y-%m-%d %H:%M:%S'` Another instance of $script_name is already running. Exiting." exit 1 fi } # Check if script is run repeatedly check_scripts