
Я пытаюсь написать два скрипта. Но у меня возникают проблемы, когда я пытаюсь предотвратить запуск одного из них дважды подряд. Например, у меня есть script1 и script2. Я хочу иметь возможность запустить script1, если и только если script2 был запущен с момента последнего запуска script1. Есть идеи?
решение1
В сценарии A проверьте, существует ли определенный файл, и если нет, коснитесь файла в каталоге /tmp (например: touch /tmp/script.lock
) и запустите код. Затем в сценарии B проверьте, существует ли файл. Если файл существует, запустите тело сценария, а затем удалите файл.
Сценарий А:
if [ ! -f /tmp/script.lock ]
then
echo hello
touch /tmp/script.lock
fi
Сценарий Б:
if [ -f /tmp/script.lock ]
then
echo hello
rm /tmp/script.lock
fi
решение2
Пусть каждый скрипт проверяет определенный файл (например /var/tmp/script1-2
, ).
Если проверочный файл не существует, запишите имя другого скрипта в файл как можно раньше, чтобы предотвратить его запуск во время выполнения этого скрипта.
Если он существует и содержит собственное имя, то выход. В противном случае запуск в обычном режиме.
Перед выходом каждый скрипт должен записать в файл свое имя.
CHECKFILE="/var/tmp/script1-2"
MYNAME='script1'
OTHERNAME='script2'
[ ! -s "$CHECKFILE" ] && echo "$OTHERNAME" > "$CHECKFILE"
[ -s "$CHECKFILE" ] && grep -qwF "$MYNAME" && exit 1
# rest of script here
.
.
echo "$MYNAME" > "$CHECKFILE"
Возможны следующие варианты grep
:
-q
для тишины, не производит никакого вывода-w
для сопоставления только целых слов-F
для сопоставления фиксированных строк, а не регулярных выражений.
Примечание: если оба скрипта запущены одновременноточнов одно и то же время и $CHECKFILE еще не существует, то они оба будут запущены. Тот, который завершится последним (займет больше времени на запуск), в итоге запишет свое имя в $CHECKFILE. Чтобы предотвратить это, запускайте echo script2 > /var/tmp/script1-2
перед запуском любого из них.
решение3
Одним из вариантов может быть запуск команды "date" в скрипте 1 и перенаправление этого вывода в какой-либо файл, скажем, "file.txt" - и тогда скрипт 2 может прочитать этот "file.txt" и выполнить сравнение "date" между этой датой и датой, когда был запущен скрипт 2? Сравнение "Date" должно быть относительно простым - множество примеров в сети (я думаю). Пища для размышлений.
Другой вариант (в зависимости от ваших требований) — это, конечно, добавление записей заданий «cron».
решение4
Если вы просто хотите узнать, запускался ли script2 ранее, сделайте следующее:
В script2 сделайте где угодно:
touch .ran_already
.
Теперь в script1 делаем:
if [ -f .ran_already ] then Here comes what the script does.. rm -f .ran_already else echo "script2 didn't run yet!" fi
Это пойдет вам на пользу, хотя это быстро и грязно.