Как сохранить PID команды lockfile в Linux - PullRequest
1 голос
/ 28 февраля 2012

Я использую команду lockfile в linux для управления доступом к специальному файлу.

Когда мой основной сценарий по какой-то причине дает сбой, у меня заканчиваются зависания блокировок, которые препятствуют любому новому запуску основного сценария и сильно мешают его выполнению.

Есть ли способ сохранить PID моих процессов файла блокировки, чтобы я мог отслеживать их и производить надлежащую очистку перед повторным запуском основного сценария.

Надеюсь, я достаточно ясно ...

1 Ответ

0 голосов
/ 29 февраля 2012

Это хрупкий механизм.Я предпочитаю использовать реальные блокировки файлов, поэтому, когда процесс, которому они принадлежат, умирает, O / S автоматически снимает блокировку.Это легко сделать в perl (используя функцию flock), но я не знаю, возможно ли это в Bash.

Более того, я полагаю, вы могли бы использовать сам файл блокировки для хранения PID скриптаудерживая блокировку, верно?

(я не слишком много пишу сценариев оболочки ... я думаю, что приведенный ниже код в основном правильный, но используйте на свой страх и риск. Существуют условия гонки.)

while [[ lockfile -! -r 0 lock.file ]]
do
    kill -0 `cat lock.file`
    if  [[ $? -ne 0 ]]
    then 
        # process doesn't exist anymore
        echo $$ >lock.file
        # do something important
        rm -f lock.file
        break
    fi
    sleep 5
done    

Или как на счет этого:

while [[ true ]]
do
    if [[ ! -e pid.file ]]
    then
        echo $$ > pid.file
    else
        if [[ kill -0 `cat pid.file`]]
        then
            # owner process exists
            sleep 30
        else
            # process gone, take ownership
            echo $$ > pid.file
            # ### DO SOMETHING IMPORTANT HERE ###
            rm -f pid.file
            break
        fi
    fi
done

Мне больше нравится второй.Это все еще далеко от совершенства (много условий гонки), но это может сработать, если не слишком много процессов, борющихся за блокировку.Кроме того, сон 30 должен включать в себя некоторую случайность, если это возможно (длина сна должна иметь случайную составляющую).

Но смотрите здесь, похоже, что вы может использовать flock с некоторыми версиями оболочки .Это было бы похоже на то, что я делаю в Perl, и это было бы безопаснее, чем альтернативы, которые я могу придумать.

...