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

Разместите логические тома в экстентах . Используйте vgdisplay, чтобы определить размер экстента (, известный из поля «Размер PE» ), и укажите соответствующее количество экстентов, которое при удвоенный не превышает «Общего PE» группы томов. Это позволяет избежать небольших ошибок округления, когда спецификация размера, такая как 2 -ГиБ, уменьшается до нескольких экстентов.

8
28.03.2021, 06:49
3 ответа

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

В вашем вопросе есть некоторая двусмысленность. Итак, во-первых, давайте предположим, что вы спрашиваете: «Как заставить скрипт выполняться только в том случае, если с момента последнего выполнения скрипта прошло определенное время».

#!/bin/bash
flag="/var/tmp/$(basename -- $0).flag"
min_age=$(( 60 * 60 * 24 )) # 24 hours

if [ -e "$flag" ] ;then
  (( $(date +%s) - $(date +%s -r "$flag") > min_age )) || exit 1
fi
touch "$flag"

# Proceed with your script
#...

Но если вы спрашиваете "Как заставить скрипт выполняться только в том случае, если он еще не выполнялся с полуночи"...

#!/bin/bash
flag="/var/tmp/$(basename -- $0).flag"

if [ -e "$flag" ] ;then
  [ $(date +%F) = $(date +%F -r "$flag") ] && exit 1
fi
touch "$flag"

# Proceed with your script
#...

--

И если вы просто спрашиваете «Как запустить сценарий при завершении работы» --, то это сильно различается от дистрибутива к дистрибутиву. Вам, скорее всего, придется заглянуть в /etc/rc6.d. Например, в моей системе есть /etc/rc.d/rc.local_shutdown, куда я могу добавлять что-то. Вам нужно будет указать, какой дистрибутив вы используете.

Или посмотрите эту ветку... Выполнить команду перед выключением

9
28.04.2021, 22:55

Самый простой во многом зависит от мнения , но я считаю, что самый простой способ сделать это — использовать cron. Вам понадобятся некоторые другие «ингредиенты» для достижения вашей цели, но cronможет служить планировщиком для запуска скрипта в bootвремя. Это предполагает, что версия cronв вашей системе предлагает средство @reboot; см. man 5 crontab, чтобы убедиться, что «специальные» строки разрешены (@reboot, @yearlyи т. д. ).

Тем не менее, использовать cronтак же просто, как редактировать crontabвашего пользователя. Из командной строки bash:

$ crontab -e

Откроется ваш crontabв редакторе по умолчанию. Добавьте следующую строку:

@reboot sleep 15; /path/to/your/script >> /path/to/your/iofile.txt 2>&1

Это запускает ваш скрипт каждый раз при загрузке системы.

  • Поскольку cronне знает о статусе каких-либо служб, требуемых в вашем скрипте, используется команда sleep 15, чтобы дать ОС 15 секунд для маршалинга всех необходимых системных ресурсов. Вам может понадобиться больше или меньше, в зависимости от необходимых ресурсов и других переменных.

  • Используйте полный путь в вашем crontab, так как среда (, в частности PATH), отличается от вашей интерактивной оболочки.

  • Вывод сценария, который будет отправлен на stderrили stdout, должен быть re -направленным в локальный файл(iofile.txt здесь ). Файл iofile.txt обеспечивает простой способ доступа к любым ошибкам, выдаваемым вашим скриптом -, очень полезен для отладки!

Вы просили применить условие к запуску вашего скрипта@reboot:"но только если он еще не был выполнен сегодня" . Это означает, что существуетвероятность того, что сценарий мог быть выполнен вручную пользователемили что система могла быть перезагружена -ранее в тот же день.

Выполнение этого условия, конечно, зависит от вашего определения"сегодня"; то есть «сегодня», как в последние 24 часа, или «сегодня», как в тот же день.

В случаеtoday=24 hours or lessваше условие может быть выполнено следующим образом:

#!/bin/bash
LAST_BOOT=$(cat /path/to/your/timestamp.txt)
CURRENT_BOOT=$(date +%s)
ELAPSED_TIME=$((CURRENT_BOOT - LAST_BOOT))
echo $CURRENT_BOOT > /path/to/your/timestamp.txt
# test ELAPSED_TIME < threshold
if [ $((ELAPSED_TIME <= 86400)) ]; then exit; fi

# the balance of your script follows...

Обратите внимание, что использование формата +%sдля dateдает время эпохи; это позволяет нам вычесть два времени загрузки для проверки на 24 часа (86 400 секунд ).

В случаеtoday=same dateваше условие может быть удовлетворено следующим образом:

#!/bin/bash
LAST_BOOT=$(cat /path/to/your/timestamp.txt)
CURRENT_BOOT=$(date +%d)
# test for same date
if [ $((CURRENT_BOOT = LAST_BOOT)) ]; then exit; fi 

# the balance of your script follows...

Обратите внимание, что формат date +%dпредоставляет только дату. Мы проверяем равенство между временем последней загрузки и текущим временем в операторе if, что означает, что скрипт уже был запущен в эту дату.

В качестве альтернативы:

После рассмотрения всех ваших комментариев вы можете рассмотреть anacron. Он не так широко используется, как cron, но у него есть то преимущество, что его @dailyрасписание «будет перемещать задачи в разные моменты времени, чтобы они выполнялись, когда система включена» . Вы также можете сравнить его преимущества и его недостатки по сравнению с cron. Если вы хотите копнуть глубже, это может помочь

5
28.04.2021, 22:55

Вы можете использовать анакрон .

Anacron позволяет планировать периодические задания на компьютерах, которые не включены постоянно. Для этого он поддерживает так называемые -файлы меток времени, в которых записывается время последнего запуска задания. Когда компьютер включен, anacron регулярно запускается с помощью различных механизмов (сценария запуска, обычных заданий cron, системных таймеров )и запускает задания, которые должны быть выполнены, на основе файлов временных меток.

С помощью anacron, чтобы запускать команду один раз в день, вам нужно поместить такую ​​​​строку в/etc/anacrontab:

@daily  0   daily-job   command
  • Первое поле представляет собой частоту и может быть @daily, @weeklyили @monthly, а также произвольное количество дней (, например, 2для каждые 2 дня ).

  • Второе поле — это задержка запуска задания после анакрона. срабатывает.

  • Третье поле — название задания.

  • Наконец, четвертое поле — это команда для выполнения.

В производных от Debian вместо этого вы можете поместить сценарий в /etc/cron.daily, поскольку anacron (, если он установлен ), по умолчанию берет на себя задачу запуска ежедневных, еженедельных и ежемесячных заданий cron.

Другой вариант — fcron , который позволяет делать то же самое (и, возможно, больше ), но личного опыта с ним у меня нет.

4
28.04.2021, 22:55

Теги

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