Как проверить, запущен ли скрипт, и приостановить его работу до завершения его выполнения, чтобы запустить снова?

Как проверить, запущен ли скрипт, и приостановить его работу до завершения его выполнения, чтобы запустить снова?

Итак, мы запускаем этот скрипт, который добавляет данные в файл, и я пытаюсь добавить что-то, чтобы проверить и увидеть, запущен ли уже скрипт. Если да, то я хочу, чтобы он остановился и снова проверил через 20 секунд и повторял это до тех пор, пока не обнаружит, что он не запущен. В этот момент я хотел бы, чтобы он перешел к остальной части скрипта. Поэтому мне нужно знать, как заставить его продолжать проверку, пока не будет разрешено продолжить. У кого-нибудь есть идеи?

    if [ `ps -ef| grep $script_name_with_arguments | wc -l ` -gt 1 ]
    then
      echo "already running"
      sleep 20s
    else
      echo "ok"
    fi
}```

решение1

Вы используете какую-то блокировку.

Самый простой способ — это файл блокировки. Есть несколько пакетов, которые будут управлять ими для вас; вы не сказали, какая у вас платформа или дистрибутив, поэтому я не могу быть очень точным, но один из них — это пакет, procmailкоторый идет вместе с lockfileпрограммой.

Вы можете использовать это в своем сценарии следующим образом:

LOCK=/run/npaulsen/mylockfile.lock
lockfile -20 $LOCK
run_the_fscking_rest_of_my_script
rm -f $LOCK

Есть усовершенствования, которые вы можете сделать, чтобы избежать зависания на неопределенный срок в случае сбоя одного экземпляра. Вы можете прочитать страницу руководства об этом: man 1 lockfile. Или вы можете реализовать свой собственный — это тривиально, но вам понадобится настоящий язык программирования (не скрипт оболочки).

Еще более изощренной (но и более сложной) идеей было бы использование семафоров POSIX; попробуйте man 7 sem_overview.

Связанный контент