Shell script: убедитесь, что script не выполняется, если он уже запущен
Возможный дубликат:
Быстрый и грязный способ обеспечения только одного экземпляра оболочки script за один раз
Я создал cronjob для резервного копирования моих папок, которые я очень горжусь. Однако я обнаружил, просмотрев результаты резервных копий, что моя резервная копия script была вызвана Crontab более одного раза, в результате чего одновременно выполняются несколько резервных копий.
Можно ли каким-либо образом гарантировать, что некоторая оболочка script не запускается, если уже выполняется тот же самый script?
Спасибо
Ответы
Ответ 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 запустите и удалите его в конце...
Через некоторое время проверьте, существует ли файл или нет, и какой файл существует.
Вы пробовали этот путь?