Разместите логические тома в экстентах . Используйте vgdisplay
, чтобы определить размер экстента (, известный из поля «Размер PE» ), и укажите соответствующее количество экстентов, которое при удвоенный не превышает «Общего PE» группы томов. Это позволяет избежать небольших ошибок округления, когда спецификация размера, такая как 2 -ГиБ, уменьшается до нескольких экстентов.
В начале сценария просто коснитесь флага где-нибудь, чтобы последующие вызовы этого сценария могли проверить наличие и возраст этого флага.
В вашем вопросе есть некоторая двусмысленность. Итак, во-первых, давайте предположим, что вы спрашиваете: «Как заставить скрипт выполняться только в том случае, если с момента последнего выполнения скрипта прошло определенное время».
#!/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
, куда я могу добавлять что-то. Вам нужно будет указать, какой дистрибутив вы используете.
Или посмотрите эту ветку... Выполнить команду перед выключением
Самый простой во многом зависит от мнения , но я считаю, что самый простой способ сделать это — использовать 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
. Если вы хотите копнуть глубже, это может помочь
Вы можете использовать анакрон .
Anacron позволяет планировать периодические задания на компьютерах, которые не включены постоянно. Для этого он поддерживает так называемые -файлы меток времени, в которых записывается время последнего запуска задания. Когда компьютер включен, anacron регулярно запускается с помощью различных механизмов (сценария запуска, обычных заданий cron, системных таймеров )и запускает задания, которые должны быть выполнены, на основе файлов временных меток.
С помощью anacron, чтобы запускать команду один раз в день, вам нужно поместить такую строку в/etc/anacrontab
:
@daily 0 daily-job command
Первое поле представляет собой частоту и может быть @daily
, @weekly
или @monthly
, а также произвольное количество дней (, например, 2
для каждые 2 дня ).
Второе поле — это задержка запуска задания после анакрона. срабатывает.
Третье поле — название задания.
Наконец, четвертое поле — это команда для выполнения.
В производных от Debian вместо этого вы можете поместить сценарий в /etc/cron.daily
, поскольку anacron (, если он установлен ), по умолчанию берет на себя задачу запуска ежедневных, еженедельных и ежемесячных заданий cron.
Другой вариант — fcron , который позволяет делать то же самое (и, возможно, больше ), но личного опыта с ним у меня нет.