Как написать скрипт, который будет запускаться только в том случае, если недавно был запущен другой скрипт?

Как написать скрипт, который будет запускаться только в том случае, если недавно был запущен другой скрипт?

Я пытаюсь написать два скрипта. Но у меня возникают проблемы, когда я пытаюсь предотвратить запуск одного из них дважды подряд. Например, у меня есть 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

Это пойдет вам на пользу, хотя это быстро и грязно.

Связанный контент