Запуск экспорта по расписанию

LinuxBeginner
Практиковаться сейчас

Введение

В этой новой среде у DAYMARK уже есть безопасный скрипт публикации. Теперь команде нужно настоящее расписание с запуском от отдельной учётной записи отчётности. Ручной успех в терминале не доказывает, что задание по расписанию найдёт или прочитает входной файл.

Вы настроите соответствующие service и timer systemd, увидите повторяющиеся реальные срабатывания, а затем исправите ошибки каталога и входных данных, не потеряв последний отчёт. Daymark — деловой сайт, Workstation начинается в /srv/daymark-sales. Достаточно основ терминала; используются понятия shell-скрипта из предыдущей пошаговой работы. Калькулятор и скрипт предоставлены без необходимости установки.

Запуск экспорта настоящим таймером

На этом шаге вы получите правильный бизнес-результат и позволите systemd выполнить экспорт дважды. Начните в Daymark. Откройте Records: исходные данные содержат 11 единиц стоимостью 3450 центов. Reports пока предлагает предыдущий итог TOTAL,1,100. Задание должно заменить файл настоящим итогом закрытия.

Перейдите в Workstation. Эта среда независима: правильный скрипт уже подготовлен, но таймер отчётности не установлен. cat выводит файлы, а pwd — текущий каталог:

pwd
cat publish.sh

Скрипт пишет рядом с назначением и переименовывает лишь после успешного расчёта. Он принимает аргументы входа и выхода. id показывает идентичность учётной записи; ls -ld — владельца и биты доступа каталога. Для прохождения через каталог нужно разрешение поиска, для создания файлов — записи.

id daymark-report
ls -ld reports

Подготовленная системная учётная запись владеет reports/. Чтение входного файла и поиск в родительских каталогах позволяют ей читать orders.csv; владение каталогом отчётов разрешает публикацию. Не используйте root или запись для всех как обходной путь.

systemd — менеджер служб этого экземпляра. Файл .service описывает одно исполнение, одноимённый .timer — время запроса исполнения. Type=oneshot ждёт завершения конечного задания. User выбирает настоящего исполнителя. WorkingDirectory задаёт место разрешения относительного orders.csv. ExecStart использует абсолютные пути программы, скрипта и выхода. Текущий каталог терминала и настройки интерактивной shell не передаются системной службе. Оставьте RemainAfterExit неустановленным: завершённое задание должно стать неактивным, чтобы следующее событие запустило его снова.

sudo tee FILE пишет защищённый файл и одновременно показывает содержимое. <<'UNIT' — here-document в кавычках; вставьте всё до соответствующего завершающего слова. Создавайте только названные юниты D10:

sudo tee /etc/systemd/system/d10-sales.service <<'UNIT'
[Unit]
Description=Daymark sales export
[Service]
Type=oneshot
User=daymark-report
WorkingDirectory=/srv/daymark-sales
ExecStart=/bin/bash /srv/daymark-sales/publish.sh orders.csv /srv/daymark-sales/reports/sales.csv
UNIT

Учебный таймер начинает через пять секунд после активации и запрашивает следующий запуск через двадцать секунд после предыдущей активации. AccuracySec=1s допускает небольшое временное окно; машина может добавить задержку. Это короткая тренировка, а не ежедневное производственное расписание. Для ежедневного запуска по часам можно заменить две относительные директивы на OnCalendar=*-*-* 23:00:00, осознанно выбрав часовой пояс сервера. Здесь короткий интервал сохраняется, чтобы наблюдать реальные исполнения.

sudo tee /etc/systemd/system/d10-sales.timer <<'UNIT'
[Unit]
Description=Daymark short training schedule
[Timer]
OnActiveSec=5s
OnUnitActiveSec=20s
AccuracySec=1s
[Install]
WantedBy=timers.target
UNIT

daemon-reload перечитывает определения юнитов. enable --now связывает таймер с timers.target для будущих загрузок и запускает его сейчас. Запускается таймер, а не ручной экспорт:

sudo systemctl daemon-reload
sudo systemctl enable --now d10-sales.timer

sleep 50 только ждёт, не выполняя задание. Не запускайте службу вручную и не заменяйте таймер циклом shell.

sleep 50

list-timers показывает настоящие срабатывания LAST и NEXT. --no-pager выводит напрямую, без прокручиваемого просмотрщика:

systemctl list-timers d10-sales.timer --no-pager

Journal — настоящий журнал событий systemd. -u выбирает юнит, -n 20 ограничивает вывод. Должны быть как минимум два полных исполнения с uid=... cwd=/srv/daymark-sales, хешем отчёта и успешным окончанием:

sudo journalctl -u d10-sales.service -n 20 --no-pager

Сравните числовой uid с id daymark-report. inactive (dead) после успешного oneshot — норма; активный таймер запросит будущие запуски. show -p выбирает отдельные свойства состояния:

systemctl show d10-sales.service -p User -p WorkingDirectory -p Result -p ExecMainStatus --no-pager

Ожидаются User=daymark-report, правильный каталог, Result=success и ExecMainStatus=0. Если срабатывания нет, прочитайте systemctl status d10-sales.timer --no-pager, исправьте только эти файлы юнитов, повторите daemon-reload и перезапустите только d10-sales.timer. restart останавливает и запускает этот таймер, применяя его изменения. Снова подождите и посмотрите journal. При CHDIR проверьте WorkingDirectory; при Permission denied — владельца входа и каталога отчётов, а не расширяйте права.

Вернитесь в Daymark, обновите Reports и скачайте новый CSV. Его итог — TOTAL,11,3450. Ещё раз откройте Records и вернитесь на главную: обычные деловые страницы должны оставаться доступными.

Восстановление следующим запуском по расписанию

На этом шаге вы увидите настоящие сбои расписания, сохраните предыдущий отчёт и опубликуете новый итог после восстановления. Начните в Workstation. Работайте только с юнитами D10 и входом этого упражнения; никогда не останавливайте посторонние службы.

Сначала создайте ошибку рабочего каталога. sed -i редактирует названный файл на месте, s|old|new| заменяет совпавший текст. Это намеренная неисправность:

sudo sed -i 's|WorkingDirectory=/srv/daymark-sales|WorkingDirectory=/tmp|' /etc/systemd/system/d10-sales.service
sudo systemctl daemon-reload
sleep 30
sudo journalctl -u d10-sales.service -n 15 --no-pager

Процесс всё ещё выполняется под отчётной записью, но orders.csv разрешается в /tmp и завершается с Export failed: ... No such file .... Если бы отсутствовал сам рабочий каталог, до запуска скрипта возник бы CHDIR. daemon-reload обновляет определения, но не выполняет задание. Неудачную попытку инициировал таймер.

cat reports/sales.csv

Отчёт всё ещё должен заканчиваться TOTAL,11,3450. В Daymark обновите Reports и скачайте файл, убедившись, что те же байты доступны. Вернитесь в Workstation и исправьте каталог:

sudo sed -i 's|WorkingDirectory=/tmp|WorkingDirectory=/srv/daymark-sales|' /etc/systemd/system/d10-sales.service
sudo systemctl daemon-reload

Теперь проверьте ошибку входа. cp копирует подготовленный некорректный набор только поверх orders.csv; калькулятор должен вернуть ненулевой статус, а скрипт оставить последний отчёт целым:

cp fixtures/broken.csv orders.csv
sleep 30
sudo journalctl -u d10-sales.service -n 15 --no-pager

Ожидается намеренная ошибка неверного числа. show раскрывает настоящий последний статус выхода независимо от успеха команды просмотра journal:

systemctl show d10-sales.service -p Result -p ExecMainStatus --no-pager

Ожидаются Result=exit-code и ExecMainStatus=1. Подтвердите сохранность предыдущего отчёта:

cat reports/sales.csv

Восстановите правильный новый итог с двумя дополнительными Tea. При следующем срабатывании общий результат должен стать 13 единиц и 3950 центов:

cp fixtures/next.csv orders.csv
sleep 30
sudo journalctl -u d10-sales.service -n 15 --no-pager
cat reports/sales.csv

Ожидаются Tea,5,1250 и TOTAL,13,3950 и более поздняя настоящая публикация в journal. Если отчёт старый, прочитайте последнюю ошибку, исправьте каталог, имя входа или скрипт и дождитесь следующего события. Не заменяйте CSV вручную и не запускайте службу вручную. Неудачный oneshot может снова выполняться этим таймером.

В Daymark обновите Records и Reports, снова скачайте файл и сравните изменённый источник с TOTAL,13,3950. Оставьте таймер активным для проверки. Упражнение не тестирует восстановление после перезагрузки, политику часовых поясов, параллельную работу разных машин и учёт пропущенных дней.

Резюме

Вы потренировали публикацию полного CSV, осмысленный статус ошибки и восстановление. Отчёт по расписанию полезен лишь тогда, когда реальный исполнитель, срабатывание и бизнес-суммы согласованы. Это упражнение на одном экземпляре использует вымышленные данные и короткое учебное расписание, а не полноценную производственную систему отчётности.