2011-09-14 69 views
0

我有兩個隨機運行的進程,我想迫使他們不要在同一時間由於讀寫器問題而運行。我的想法是每當一個進程運行時,我創建一個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也不會生成錯誤。有針對這個的解決方法嗎?

+0

yoo可以讓每個進程創建自己的鎖文件並測試其他進程文件的存在。例如。 cat/dev/null> $ {INPUT_DIR} /LOCK.processA,然後查找$ {INPUT_DIR} /LOCK.processB,反之亦然 – Karl

+0

您需要一個原子命令來避免併發風險。這可以像避難所建議的mkdir一樣,也可以創建鏈接。順便說一句,'cat/dev/null'沒有做任何有用的事情,所以可以用null命令替代,即':'甚至根本沒有命令。在ksh和大多數shell中重定向已經足夠了。 – jlliagre

回答

2

對於unix的主要版本,首選的解決方案是使用鎖定目錄,我假設這對於Linux是正確的,但我最近沒有對它進行測試。

創建一個目錄是一個原子進程,只有一個進程會成功,假設你正在創建一個像/bin/mkdir -p /tmp/myProjWorkSpace/LOCK這樣的靜態名稱。如果您需要將信息嵌入鎖中,那麼您需要一個文件,並且您需要每個進程的sepqrate子目錄,可能會將進程ID(.$$)添加到目錄名稱。

我希望這會有所幫助。