Подтвердить что ты не робот

Shell script: убедитесь, что script не выполняется, если он уже запущен

Возможный дубликат:
Быстрый и грязный способ обеспечения только одного экземпляра оболочки script за один раз

Я создал cronjob для резервного копирования моих папок, которые я очень горжусь. Однако я обнаружил, просмотрев результаты резервных копий, что моя резервная копия script была вызвана Crontab более одного раза, в результате чего одновременно выполняются несколько резервных копий.

Можно ли каким-либо образом гарантировать, что некоторая оболочка script не запускается, если уже выполняется тот же самый script?

Спасибо

4b9b3361

Ответ 1

Решение без условий гонки или ранних проблем выхода - использовать файл блокировки. Утилита flock обрабатывает это очень хорошо и может быть использована следующим образом:

flock -n /var/run/your.lockfile -c /your/script

Он немедленно вернется с статусом не 0, если script уже запущен.

Ответ 2

Обычный и простой способ сделать это - поставить что-то вроде:

if [[ -f /tmp/myscript.running ]] ; then
    exit
fi
touch /tmp/myscript.running

наверху script и

rm -f /tmp/myscript.running

в конце и в функциях trap, если он не достигнет конца.

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

Ответ 3

Хороший способ без файла блокировки:

ps | grep $0 | grep -v grep > /var/tmp/$0.pid
pids=$(cat /var/tmp/$0.pid | cut -d ' ' -f 1)
for pid in $pids
do
   if [ $pid -ne $$ ]; then
      logprint " $0 is already running. Exiting"
      exit 7
   fi
done
rm -f /var/tmp/$0.pid

Это делает это без файла блокировки, что здорово. ps в файл temp, очистите первое поле (pid #) и ищите сами. Если мы найдем другую, то кто-то уже работает. Grep $0 состоит в том, чтобы сократить список только до тех экземпляров этой программы, а grep -v grep избавится от строки, которая является самой grep:)

Ответ 4

Вы можете использовать файл tmp.
Названо это tmpCronBkp.a, tmpCronBkp.b, tmpCronBkp.c... и т.д. Выпущено из резервной копии yout script.

Создайте его на script запустите и удалите его в конце...

Через некоторое время проверьте, существует ли файл или нет, и какой файл существует.

Вы пробовали этот путь?