я нашел эта интересная страница что предлагает несколько вариантов:
flock
solo
А как же его вариант:
Проверьте ps
чтобы узнать, выполняется ли в настоящий момент выполненная команда.
(А ps-check.sh
сценарий может быть даже включен в начало каждого создаваемого вами задания cron.)
Я предполагаю, что причина, по которой я не нашел такого решения, в том, что это плохая идея.
Почему это плохая идея?
ps-check.sh
может вернуть 1, если команда уже выполняется. Скрипт cron может вызывать ps-check.sh
как это:
#!/bin/bash
#some script
#get current script name into variable
#then use ps-check.sh to see if current script is already running
#by supplying it with 2 things: script name and current PID
me=`basename "$0"`
if (( $(ps-check.sh $me $$) == 1)); then
exit 1;
fi
# do more stuff
ps-check.sh
проверит, запущен ли уже сценарий под другим PID.
Есть ли случай, когда скрипт будет запущен, но не будет отображаться в ps
? Если спишь?
РЕДАКТИРОВАТЬ - Заключение:
Я решил пойти с flock
. Проверка ps
может сработать, но мне, вероятно, придется справиться с множеством условий, чтобы убедиться. Я предполагаю flock
уже обрабатывает большинство из них.
Недостаток в использовании ps
логика в том, что вы ожидаете обработать название быть уникальным.
Если вы всегда не запускаете свои процессы с абсолютным путем, другой пользователь (или вы сами) можете легко создать совершенно другой процесс с тем же именем, что предотвратит запуск вашего задания cron.
Я бы рекомендовал использовать один пробег команда - намного проще, чем разбираться с замками. Из документов:
один пробег - сценарий-оболочка, который запускает не более одного уникального экземпляра некоторой команды с уникальным набором аргументов. Это часто бывает полезно с cronjobs, когда вы хотите, чтобы одновременно выполнялось не более одной копии.
беги-это-один точно так же, как run-one, за исключением того, что он будет использовать pgrep и kill для поиска и уничтожения любых запущенных процессов, принадлежащих пользователю и соответствующих целевым командам и аргументам. Обратите внимание, что run-this-one будет блокироваться при попытке убить соответствующие процессы, пока все соответствующие процессы не будут мертвы.
бегать-один-постоянно работает точно так же, как run-one, за исключением того, что он воспроизводит "COMMAND [ARGS]" каждый раз, когда COMMAND завершается (ноль или ненулевое значение).
бежать это псевдоним для run-one-always.
беги один до успеха работает точно так же, как run-one-always, за исключением того, что он возрождает "COMMAND [ARGS]" до тех пор, пока COMMAND не завершится успешно (т.е. не завершится с нуля).
пробежать один до отказа работает точно так же, как run-one-always, за исключением того, что он возрождает «COMMAND [ARGS]» до тех пор, пока COMMAND не завершится с ошибкой (т. е. завершится ненулевым).