как остановить cronjob после предыдущего успеха - PullRequest
0 голосов
/ 04 августа 2020

я пишу скрипт crontab, который будет запускаться каждую субботу каждые 15 минут. Идея состоит в том, чтобы проверить статус внешнего API = УСПЕХ или нет. В случае успеха задание cron на день больше не должно запускаться. Прямо сейчас я пытаюсь использовать рекурсию, но я не думаю, что это лучшее решение. Есть ли другое решение для этого? Я использую сценарий оболочки для вызова api.

Вот существующий фрагмент:

  • Cronjob:

    */15 * * * 6 validate.sh 
    
  • script :

    status='curl -X GET "api"' 
    if [[ $status == "SUCCEEDED" ]];then 
        trigger email
    else sleep 180 
        ./validate.sh     
    fi 
    

1 Ответ

1 голос
/ 04 августа 2020

Добавьте другое задание cron, чтобы оно удалило файл флага в пятницу вечером, до того, как другое задание начнет выполняться:

59 23 * * 5 rm .succeeded.txt

Затем измените свой сценарий, чтобы он прервался, если этот файл существует, и создал его когда это удастся.

#!/bin/bash

test -e .succeeded.txt && exit
 
if [[ $(curl -X GET "api") == "SUCCEEDED" ]];then 
    trigger email
    touch .succeeded.txt
fi

Я пытался исправить и другие ошибки в вашем скрипте, но мне пришлось угадывать многие вещи. Это предполагает, что "SUCCEEDED" является единственным выходом из curl, когда GET работает.

Помещение команды в переменную - бесполезное осложнение, которое делает ваш скрипт длиннее и (очень немного) медленнее, но в кроме того, это создает собственные проблемы, когда команда содержит встроенные кавычки; см., например, http://mywiki.wooledge.org/BashFAQ/050

... Но, конечно, по-видимому, вы действительно хотели запустить команду. Ваша попытка просто проверила бы, равна ли строка в переменной "SUCEEDED", что, конечно, никогда не будет.

Другая проблема заключалась в том, что вы создавали несколько validate.sh заданий, каждое из которых рекурсивно и повторить. Вы хотите того или другого, а не обоих. Я придерживался вашего графика и просто пробовал один раз в каждой работе.

...