KSH:阻止两个进程同时运行

时间:2011-09-14 18:51:55

标签: unix concurrency ksh sh

我有两个随机运行的进程,我想强迫它们不要因读写器问题而同时运行。我的想法是每当进程运行时,我创建一个LOCK文件,两个进程都有一个检查是否存在LOCK的逻辑。如果存在LOCK,则暂时休眠并唤醒并再次检查。这是一小部分

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

如果不这样,QUITE会阻止两个进程同时运行。如果日志存在(两个进程同时调用并且没有LOCK存在,很可能它将通过第一个IF语句),那么两个进程都会通过第一次IF检查的情况很少见。 ,两者都尝试创建一个LOCK文件,因为即使LOCK已经存在,cat /dev/null > ${INPUT_DIR}/LOCK也不会产生错误。有解决方案吗?

1 个答案:

答案 0 :(得分:2)

对于unix的主要版本,首选的解决方案是使用锁定目录,我认为这适用于linux,但我最近没有测试过。

创建目录是一个原子进程,只有一个进程会成功,假设您正在创建一个静态名称,如/bin/mkdir -p /tmp/myProjWorkSpace/LOCK。如果您需要在锁中嵌入信息,那么您需要一个文件,并且每个进程需要sepqrate子目录,可能会将processID(.$$)添加到目录名称。

我希望这会有所帮助。