KSH: блокировать запуск двух процессов одновременно - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть два процесса, которые запускаются в случайное время, и я хочу заставить их никогда не запускаться одновременно из-за проблемы чтения-записи.Я думаю, что когда процесс запускается, я создаю файл 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

Как бы то ни было, это НЕ ОЧЕНЬ останавливает одновременный запуск двух процессов.Редко бывает, когда оба процесса проходят первую проверку IF, если журнал существует (если оба процесса get вызывают одновременно и не существует LOCK, очень вероятно, что он пройдет первый оператор IF), оба пытаются создать файл LOCK, так как cat /dev/null > ${INPUT_DIR}/LOCK не выдаст ошибку, даже если LOCK уже существует.Есть ли решение для этого?

1 Ответ

2 голосов
/ 14 сентября 2011

Для основных версий unix предпочтительным решением является использование каталога блокировки, я бы предположил, что это верно для linux, но мне не пришлось тестировать его недавно.

Создание каталога - этоатомарный процесс, и только 1 из процессов будет успешным, при условии, что вы создаете статическое имя, подобное /bin/mkdir -p /tmp/myProjWorkSpace/LOCK.Если вам нужна информация, встроенная в вашу блокировку, тогда вам нужен файл, и вам нужно sepqrate subdir для каждого процесса, возможно, добавьте processID (.$$) к имени dir.

Надеюсь, это поможет.

...