Комментарии 71
man 1 flock
функций даже побольше, есть в стандартных конфигурациях в линуксе
функций даже побольше, есть в стандартных конфигурациях в линуксе
+9
Прекрасно, а дальше что? Самому еще раз написать эту утилиту? Она как раз флок и использует.
-7
Ого, а я как дурак для этого скрипт на шелле использовал, вот такой: code.reddit.com/browser/scripts/saferun.sh
Я туда правда добавил еще проверку load average, чтобы некоторые скрипты могли подождать если в момент, когда крон их решил запустить уже и так нагрузка высокая. Но проверку на существование процесса надо будет на flock переделать на досуге.
Я туда правда добавил еще проверку load average, чтобы некоторые скрипты могли подождать если в момент, когда крон их решил запустить уже и так нагрузка высокая. Но проверку на существование процесса надо будет на flock переделать на досуге.
0
0
Нашел на линуксовом сервере. На freebsd найти не удалось, оно там есть?
-2
на сколько я знаю, нету.
для BSD пойдёт :)
для BSD пойдёт :)
+1
Я тут над flock экспериментирую — никак не могу заставить его ругаться при выходе. Это возможно?
-2
На FreeBSD — lockf
+1
О. А пример использования в описанном контексте не подкинете?
0
* * * * * /usr/local/bin/lockrun --lockfile=/tmp/megacache.lockrun — /path/to/megacache/generator
* * * * * lockf /tmp/megacache.lockrun /path/to/megacache/generator
* * * * * lockf /tmp/megacache.lockrun /path/to/megacache/generator
0
[mixailo@DTG1127 ~]$ lockf pid.lock sleep 60 &
[1] 69177
[mixailo@DTG1127 ~]$ lockf pid.lock sleep 60 &
[2] 69352
Не то что-то.
[1] 69177
[mixailo@DTG1127 ~]$ lockf pid.lock sleep 60 &
[2] 69352
Не то что-то.
0
Почитайте man. Там написано, что по умолчанию, lockf будет бесконечно ждать освобождения лок-файла.
У вас в примере вторая команда ждёт выполнения первой для начала своей работы.
А если поставит нулевое время ожидания:
[root@bsd ~]# lockf -t 0 pid.lock sleep 60 &
[1] 65999
[root@bsd ~]# lockf -t 0 pid.lock sleep 60
lockf: pid.lock: already locked
У вас в примере вторая команда ждёт выполнения первой для начала своей работы.
А если поставит нулевое время ожидания:
[root@bsd ~]# lockf -t 0 pid.lock sleep 60 &
[1] 65999
[root@bsd ~]# lockf -t 0 pid.lock sleep 60
lockf: pid.lock: already locked
+1
Вроде же в линуксе есть нормальные именованые мютексы, которые могут использоваться для этой задачи куда удобнее и эффективнее, чем файлы. Я бы понял, если бы решение было на PHP, но вы используете С (кстати, программы на С не зовутся скриптами) — почему не мютексы?
-2
Я не автор скрипта, поэтому не могу ответить вам на этот вопрос.
-3
Ну, файлы — это Unix way. Это даёт возможность для просмотра установленных блокировок использовать ls (dir в windows).
+1
В этом что-то есть, хотя родной линуксовый flock за собой файл не удаляет.
-1
Я еще не слышал, чтобы Unix way-ем называли использованием неподходящих инструментов при наличии подходящих.
0
А чем он неподходящий? Кроме того, что мьютекс, условно говоря, находится в пространстве имён недоступном через файловый API.
0
В Win32 мютекс от приложения, которое умерло не своей смертью, умирает вместе с ним (точнее, переходит в состояние abadonned) и в результате становятся не нужны экзорцизмы, связанные с удалением файла в случае некорректного завершения работы.
-1
>не нужны экзорцизмы, связанные с удалением файла в случае некорректного завершения работы.
они и в юниксах не нужны
они и в юниксах не нужны
0
Это да. Но если есть (я не смотрел) простой способ определить открыт ли кем-то файл, то это решает проблему.
0
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Менее надёжно, но более популярно:
Если произошёл коллапс и файл-таки остался, то вместо "|| exit" можно осуществлять проверку существования процесса.
ln -s $$ lock-file || exit
trap "rm -f lock-file" EXIT
trap "trap - EXIT; rm -f lock-file" HUP INT QUIT
Если произошёл коллапс и файл-таки остался, то вместо "|| exit" можно осуществлять проверку существования процесса.
+1
Плюс в том, что если cleanup не отработал, то произошло что-то плохое и это дело лучше разгрести руками.
0
Вау. А что делает последняя строчка?
Трап на попытку прибить скрипт ставит трап на EXIT и если получает exit то… вот дальше непонял.
Трап на попытку прибить скрипт ставит трап на EXIT и если получает exit то… вот дальше непонял.
0
Ай, бага ручного ввода, надо было копипастить :( в последней строчке должен быть exit в самом конце обработчика.
Обработчик (на стандартные сигналы завершения, можно при желании пополнить список) сбрасывает хук на выход, освобождает файл и выходит (в этот момент хук на выход уже сброшен, так что файл 2й раз не удаляется).
Обработчик (на стандартные сигналы завершения, можно при желании пополнить список) сбрасывает хук на выход, освобождает файл и выходит (в этот момент хук на выход уже сброшен, так что файл 2й раз не удаляется).
0
apt-cache show lockfile-progs
cron, между прочим, recommends.
Пример использования в /etc/cron.daily/standard
cron, между прочим, recommends.
Пример использования в /etc/cron.daily/standard
0
Спасибо за поднятую тему. Узнал про flock!
+2
Линуксоиды не умеют мьютексы?
-4
Я тут немного отрекламирую «замену крона»: http://search.cpan.org/~kohts/snaked-0.07/lib/snaked.pm
Кому-то может показаться, что это «изобретание велосипеда», но на самом деле — штука очень удобная и умеет справляться с описанной в топике задачей.
Кому-то может показаться, что это «изобретание велосипеда», но на самом деле — штука очень удобная и умеет справляться с описанной в топике задачей.
0
НЛО прилетело и опубликовало эту надпись здесь
Я давно для таких целей использую runit.
Просто run-скрипт задаю как
Просто run-скрипт задаю как
#!/bin/sh
exec 2>&1
sleep exec do periodic task
0
pidof -s -o '%PPID' -x $( basename $0 ) > /dev/null 2>&1 && exit
0
А что не так с классическим
*/5 * * * * pgrep -f my_command &>/dev/null || my_command
применительно к конкретной ситуации описанной в начале?
*/5 * * * * pgrep -f my_command &>/dev/null || my_command
применительно к конкретной ситуации описанной в начале?
+3
А чем плох mktemp? Проверяем не создан ли временный файл, если нет, создаем и запускаем скрипт. Файл прибивается автоматически при завершении скрипта.
0
По моему вполне хватает создания файла и его удаления после выполнения скрипта, так в большинстве скриптов реализовано в линуксе.
0
Есть еще lckdo — включен в стандартный дебиановский репозиторий.
+1
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.
Простая защита от двойного запуска заданий cron