防止指令碼重複執行方法

fjzcau發表於2015-02-08
清單 3. 防止指令碼重複執行方法 1
#!/usr/bin/ksh

main(){
selfPID="$$"
scriptFile="$0"

typeset existingPid
existingPid=`getExistingPIDs $selfPID "$scriptFile"`

if [ ! -z "$existingPid" ]; then
  echo "The script already running, exiting..."
  exit -1
fi

doItsTask

}

#獲取除本身程式以外其它執行當前指令碼的程式的 PID
getExistingPIDs(){
selfPID="$1"
scriptFile="$2"

ps -ef | grep "/usr/bin/ksh ${scriptFile}" | grep -v "grep" | awk "{ if(\$2!=$selfPID) print \$2 }"
}

doItsTask(){
echo "Task is now being executed..."
sleep 20  #睡眠 20s,以模擬指令碼在執行需要長時間完成的任務
}

main $*


清單 4. 防止指令碼重複執行方法 2
#!/usr/bin/ksh

main(){
selfPID="$$"
scriptFile="$0"

typeset existingPid
existingPid=`getExistingPIDs $selfPID "$scriptFile"`

if [ ! -z "$existingPid" ]; then
  echo "The script already running, killing it..."
  kill -9 "$existingPid" #此方法有一定風險,慎用!
fi

doItsTask

}

#獲取除本身程式以外其它執行當前指令碼的程式的 PID
getExistingPIDs(){
selfPID="$1"
scriptFile="$2"
ps -ef | grep "/usr/bin/ksh ${scriptFile}" | grep -v "grep" | awk "{ if(\$2!=$selfPID) print \$2 }"
}

doItsTask(){
echo "Task is now being executed..."
sleep 20  #睡眠 20s,以模擬指令碼在執行需要長時間完成的任務
}

main $*

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22661144/viewspace-1430664/,如需轉載,請註明出處,否則將追究法律責任。

相關文章