Оба выражения выглядят как утро среды, и только одно из них означает один раз. 0 10 * * 3 срабатывает в 10:00 в среду; * 10 * * 3 срабатывает каждую минуту десятого часа, шестьдесят возможностей запустить один и тот же туннель. Если команда это запускатель, который не проверяет существующую сессию, вторая версия не ошибка планирования, а цикл, порождающий конкурирующих владельцев. Прочитайте поле минут прежде всего остального.

Пять полей это минута, час, день месяца, месяц и день недели, именно в таком порядке, а звёздочка в первом означает каждую минуту.

Поле минут решает, сколько раз

Ведущее число это минута, поэтому 0 10 * * 3 это первая минута десятого часа в среду. Замена его на звёздочку сохраняет час и день и отменяет свойство только-один-раз, что даёт шестьдесят совпадений. Cron не удаляет дубликаты: каждое совпадение заново запускает команду. Это не тонкость cron, это семантика полей, и справочник установленного планировщика стоит прочитать, потому что порядок полей и необязательный столбец имени пользователя различаются у пользовательского и системного crontab.

Проверьте безобидной командой, которая в течение суток записывает собственную отметку времени. Одна строка в журнале это расписание; шестьдесят строк за час это урок.

Что второй запуск делает с первым

Благовоспитанный запускатель замечает, что соединение уже установлено, и ничего не делает. Сырой вызов openvpn нет: он создаёт ещё один процесс, ещё одну попытку занять устройство или порт, и ещё один набор маршрутов, конкурирующих за одни и те же адресаты. В NetworkManager повторные запросы активации для одного соединения обычно идемпотентны, и именно поэтому проблема остаётся скрытой, пока кто-нибудь не воспользуется другой командой. Расписание должно спрашивать владельца, который уже управляет туннелем.

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

Сосчитайте поля перед командой

Пользовательский и системный crontab различаются тем, есть ли перед командой столбец с именем пользователя. Запись, скопированная между ними, либо выполняется под неправильной учётной записью, либо передаёт имя пользователя как первое слово команды. Сверяйтесь с установленным справочником, а не с руководством, и считайте поля в собственной строке. Запись с пятью полями и шестым словом перед командой это системный crontab; та же строка в пользовательском crontab пытается выполнить это слово как программу.

Идентичность выполнения несёт с собой окружение. Задание cron не наследует разблокированную связку ключей, интерактивный запрос пароля или рабочий каталог, в котором вы тестировали.

Ждите готовности, а не часов

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

Если в этот час требуется интерактивная MFA, задание может привлечь внимание человека, но не может предоставить ответ. Оставьте этот случай явным вместо того, чтобы встраивать многоразовый пароль или повторять попытки бесконечно.

Для действительно однократной активации используйте поддерживаемый однократный механизм. Повторяющееся правило, которое нужно помнить и удалять, это будущий двойной запуск.

Похожие статьи