我有兩個隨機運行的進程,我想迫使他們不要在同一時間由於讀寫器問題而運行。我的想法是每當一個進程運行時,我創建一個LOCK文件,這兩個進程都有檢查LOCK是否存在的邏輯。如果LOCK存在,然後休眠一下並喚醒並再次檢查。這裏是它的一小部分KSH:同時運行Block 2進程
if [[ ! -f ${INPUT_DIR}/LOCK ]]
then
#Create LOCK file
cat /dev/null > ${INPUT_DIR}/LOCK
retcode=${?}
if [[ ${retcode} -ne 0 ]]
then
echo `date` "Error in creating LOCK file by processA.sh - Error code: " ${retcode} >> ${CORE_LOG}
exit
fi
echo `date` "LOCK turns on by processA.sh" >> ${CORE_LOG}
...
rm ${INPUT_DIR}/LOCK
fi
不管怎樣,這並不妨礙兩個進程同時運行。很少有時候這兩個進程會通過第一個IF檢查是否存在日誌(如果兩個進程同時調用並且沒有LOCK存在,很可能它會通過第一個IF語句),都嘗試創建LOCK文件,因爲即使LOCK已經存在,cat /dev/null > ${INPUT_DIR}/LOCK
也不會生成錯誤。有針對這個的解決方法嗎?
yoo可以讓每個進程創建自己的鎖文件並測試其他進程文件的存在。例如。 cat/dev/null> $ {INPUT_DIR} /LOCK.processA,然後查找$ {INPUT_DIR} /LOCK.processB,反之亦然 – Karl
您需要一個原子命令來避免併發風險。這可以像避難所建議的mkdir一樣,也可以創建鏈接。順便說一句,'cat/dev/null'沒有做任何有用的事情,所以可以用null命令替代,即':'甚至根本沒有命令。在ksh和大多數shell中重定向已經足夠了。 – jlliagre