Не произойдет ничего страшного, если пользовательские задания в crontab не выполнятся из-за того, что система была выключена, потому что их можно скорректировать так, чтоб они начали выполняться после включения. Проблема возникает, когда в установленное время не выполняются ежедневные, еженедельные и ежемесячные системные задания.
Назначение сценария в листинге 6.11 состоит в том, чтобы дать администратору возможность выполнить ежедневные, еженедельные и ежемесячные задания непосредственно из командной строки.
Код
Листинг 6.11. Сценарий docron
··#!/bin/bash
··# docron — запускает те ежедневные, еженедельные и ежемесячные системные
··#·· задания cron, которые, скорее всего, не могли быть выполнены из-за
··#·· выключения системы в часы, на которые эти задания
··#·· запланированы.
··rootcron="/etc/crontab" # Этот путь может значительно отличаться в разных
··························#·· версиях Unix и Linux.
··if [$# −ne 1]; then
····echo "Usage: $0 [daily|weekly|monthly]" >&2
····exit 1
··fi
··# Если сценарий запущен не администратором, завершить с сообщением.
··#·· В предыдущих сценариях вы могли видеть, как проверяются USER и LOGNAME,
··#·· но в этой ситуации проверяется непосредственно числовой идентификатор
··#·· пользователя. root = 0.
··if ["$(id −u)" −ne 0]; then
····# Здесь также можно использовать $(whoami)!= "root".
····echo "$0: Command must be run as 'root'" >&2
····exit 1
··fi
··# Предполагается, что в системном файле cron имеются записи с метками
··#·· 'daily', 'weekly' и 'monthly' (ежедневно, еженедельно и ежемесячно).
··#·· Если заданий с такими метками нет, это ошибка. Но в случае, если
··#·· такие задания имеются (что соответствует нашим ожиданиям), попытаемся
··#·· сначала получить команду.
··if [-z "$job"]; then··# Нет задания? Странно. Ладно, это ошибка.
····echo "$0: Error: no $1 job found in $rootcron" >&2
····exit 1
··fi
··SHELL=$(which sh) # Для соответствия с умолчаниями в cron
Как это работает
Задания cron, находящиеся в каталогах
Запись в файле
$ egrep '(daily|weekly|monthly)' /etc/crontab
# Запустить ежедневные/еженедельные/ежемесячные задания.
15······3······ *······ *······ *······ root·· periodic daily
30······4······ *······ *······ 6······ root·· periodic weekly