Выполнять скрипт bash буквально через каждые 3 дня

Возможно, я ошибаюсь (довольно новичок в этом, не уверен в нюансах между сборками), но вы можете попробовать:

sudo apt-get remove [package_to_be_removed] # удаляет связанные папки и файлы

# удаляет связанные папки, файлы и файлы конфигурации.

1
задан 25 September 2016 в 16:48

4 ответа

Cron действительно является неправильным инструментом для этого. На самом деле есть обычно используемый и подложенный инструмент, на который может работать. в основном предназначен для интерактивного использования, и я уверен, что кто-то найдет лучший способ сделать это.

В моем случае у меня будет скрипт, который я запускаю, указанный в файле testjobs.txt, и включаю строку, которая читает.

В качестве примера у меня было бы это как testjob. txt

echo "cat" >> foo.txt
date >> foo.txt
at now + 3 days < testjobs.txt

У меня есть две невинные команды, которые могут быть вашими shellscripts. Я запускаю эхо, чтобы убедиться, что у меня есть детерминированный вывод, а дата для подтверждения выполнения команды по мере необходимости. Когда при выполнении этой команды она завершится добавлением нового задания на 3 дня. (Я тестировал с одной минутой - что работает)

Я почти уверен, что меня вызвали к тому, как я злоупотреблял, но его удобный инструмент для планирования команды, которую нужно запустить в основном время или x дней после предыдущей команды.

12
ответ дан 23 May 2018 в 05:47
  • 1
    +1 как at, кажется, лучший подход здесь. Проблема с этим подходом заключается в том, что каждый раз, когда вы вручную запускаете скрипт, вы добавляете еще один набор заданий за каждый день at. – Dewi Morgan 25 September 2016 в 18:20
  • 2
    +1, но еще одна проблема (в дополнение к той, на которую указывает @DewiMorgan), заключается в том, что если один скрипт терпит неудачу, все последующие сценарии не будут запущены (если at находится после точки отказа), пока вы не поймете, что сценарий не удалось и перезапустить его. Это может быть плохо, а иногда и хорошо (ex: не удается, потому что условия больше нет: хорошо, что он не повторяет за 3 дня?). И есть небольшой дрейф каждый раз (несколько миллисекунд, если at находится наверху или потенциально намного больше, если at находится в нижней части сценария длительного исполнения) – Olivier Dulac 26 September 2016 в 12:47
  • 3
    В можете отправлять электронные письма .... Что может быть решением проблемы. atq и atrm позволили бы отбросить ошибочные рабочие места? Теоретически вы можете написать конкретную дату, но это кажется неэлегантным и ручным. – Journeyman Geek 26 September 2016 в 13:04
  • 4
    Так что у вас есть cronjob, который проверяет наличие следующего прогона в; если его нет, добавьте его в течение 3 дней и предупредите (или запустите его немедленно и повторите проверку). – djsmiley2k 26 September 2016 в 14:21

Во-первых, фрагмент кода выше недействителен синтаксисом Bash, выглядит как Perl. Во-вторых, параметр z на date заставляет его выводить числовой часовой пояс. +%j - номер дня. Вам нужно:

if [[ ! $(( $(date +%j) % 3 )) ]] ;then
     exit
fi

Но вы все равно увидите странность в конце года:

$ for i in 364 365  1 ; do echo "Day $i, $(( $i % 3 ))"; done
Day 364, 1
Day 365, 2
Day 1, 1

Вам может быть повезло с сохранением количества в файле, и тестирование / обновление.

3
ответ дан 23 May 2018 в 05:47
  • 1
    Perl не имеет встроенной функции date(), но это немного похоже на date () в PHP (где z есть «День года (начиная с 0)» ) – ilkkachu 26 September 2016 в 14:54

Если вы можете просто оставить сценарий, выполняемый постоянно, вы могли бы сделать:

while true; do

[inert code here]

sleep 259200
done

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

2
ответ дан 23 May 2018 в 05:47
  • 1
    Почему бы не while true? – Jonathan Leffler 25 September 2016 в 17:31
  • 2
    Хах! Хороший улов. Мне не нужно было использовать это в течение длительного времени, я забыл, что он существует lol – mkingsbu 25 September 2016 в 17:32
  • 3
    В качестве решения at это будет дрейфовать по времени выполнения каждого сценария. Конечно, это можно обойти, экономя время, когда скрипт начинает и спит до 3 дней. – ilkkachu 26 September 2016 в 14:56

Вы можете использовать anacron вместо cron, он предназначен именно для того, чтобы делать то, что вам нужно. Из manpage:

Anacron может использоваться для выполнения команд периодически, с частотой, указанной в днях. В отличие от cron (8), он не предполагает, что машина работает непрерывно. Следовательно, он может использоваться на машинах, которые не работают 24 часа в сутки, для контроля ежедневных, еженедельных и ежемесячных заданий, которые обычно контролируются cron. При выполнении Anacron считывает список заданий из файла конфигурации, обычно / etc / anacrontab (см. Anacrontab (5)). Этот файл содержит список заданий, которые контролирует Anacron. Каждая запись задает период в днях, задержку в минутах, уникальный идентификатор задания и команду оболочки. Для каждого задания Anacron проверяет, выполнялось ли это задание за последние n дней, где n - период, указанный для этого задания. Если нет, Anacron запускает команду оболочки задания, после ожидания количества минут, заданных в качестве параметра задержки. После выхода команды Anacron записывает дату в специальном файле timestamp для этого задания, поэтому он может знать, когда его снова выполнить. Для расчета времени используется только дата. Час не используется.
2
ответ дан 23 May 2018 в 05:47
  • 1
    Приятно, я обязательно проверю Anacron. Интересно, почему он настолько недооценен, если он может совершать такую ​​магию – Taavi 26 September 2016 в 16:51
  • 2
    Реальный вопрос: почему крон не был заменен чем-то лучше к настоящему времени? fcron существует, и я думаю, что systemd работает над своим решением, но я не в курсе текущего состояния дел. – Twinkles 26 September 2016 в 17:33

Другие вопросы по тегам:

Похожие вопросы: