Cronjob каждые 1445 минут

В первую очередь, извините свой плохой английский язык. Я плохо знаком с Crontab, и я делал некоторые расписания. Я очищал некоторые данные из Интернета с Python, и у меня есть этот веб-сайт, что при очистке некоторых данных необходимо ожидать точно 24 часа для получения следующей части данных, поэтому если мой cronjob запускается в 00,00 каждый день, и требуется несколько секунд, чтобы выполнить Селен и очистить данные. На следующий день должны работать со смещением нескольких секунд для проверки passet 24 часа с момента, я сделал очистку а не 24 часа с момента задание запущенный. Так, есть ли любой способ выполнять задание каждый день с задержкой 5 минут от накануне, или я должен сделать что-то в сценарии Python, который будет спать дольше каждый день.

Извините за длинное сообщение

4
задан 31 March 2019 в 00:23

3 ответа

или я должен сделать что-то в сценарии Python, который будет спать дольше каждый день.

Вероятно, самое легкое. крон не может обработать переменные во время. at команда намного более гибка, когда это во время, необходимо запустить сценарий. Вам нужно, сценарий, который выполняет a

at midnight + 1 minute < {script}

Этот 1 является переменной, которую Вы увеличиваете на основе дня, который Вы запустили (день 1 составляет +1 минуту, день 2 составляет +2 минуты и т.д.). Следите, хотя Вы столкнетесь с проблемой в какой-то момент: в 60 * 24 = 1 440 дней Вы сделали бы, чтобы Вы работали мимо в следующую полночь. Добавьте что сценарий к своему крону.

Существует также at -t где Вы назначаете время, которое сделало бы это нормальными командами, где Вам не нужен крон:

at -t 201903300000
at -t 201903310001    
at -t 201903010002
...
at -t 201912310410 

(в 0:00 30.03.2019, 1 минута прошлое 0:00 на 31,3, 2 минуты прошлое 0:00 на 1,4 и т.д.)

3
ответ дан 1 December 2019 в 09:12

Другой возможный способ достигнуть Вашей цели состоит в том, чтобы использовать systemd единицы таймера и сервисные единицы вместо cronjob.

Файл /etc/systemd/system/my-script.timer:

[Unit]
Description=Timer for MyScript

[Timer]
OnBootSec=2min
OnUnitInactiveSec=1day 5min

[Install]
WantedBy=multi-user.target

Файл /etc/systemd/system/my-script.service:

[Unit]
Description=MyScript

[Service]
Type=oneshot
ExecStart=/path/to/my-script.sh

Затем выполните следующие команды:

sudo systemctl daemon-reload
sudo systemctl enable --now my-script.timer

Это включит (=autostart во время начальной загрузки) единицу таймера и запустит ее прямо сейчас.

Единица таймера управляет сервисной единицей, которая является: это запускает сервисную единицу того же имени (my-script) Спустя 2 минуты после того, как система загрузилась, и с тех пор она перезапускает сервисную единицу 1 день и спустя 5 минут после того, как сервисная единица стала неактивной (=has, остановился).

Если время начальной загрузки составляет больше чем 2 минуты в прошлом, таймер сразу активируется.

Обратите внимание, что сервисная единица будет работать как пользовательский корень. Для изменения этого добавьте User= припишите сервисной единице:

[Unit]
Description=MyScript

[Service]
Type=oneshot
User=djsony90
ExecStart=/path/to/my-script.sh

Проверять состояние, проблему:

systemctl status my-script.{timer,service}
● my-script.timer - Timer for MyScript
   Loaded: loaded (/etc/systemd/system/my-script.timer; enabled; vendor preset: enabled)
   Active: active (waiting) since Sun 2019-03-31 13:47:29 CEST; 19min ago
  Trigger: Mon 2019-04-01 13:52:59 CEST; 23h left

Mar 31 13:47:29 host systemd[1]: Started Timer for MyScript.

● my-script.service - MyScript
   Loaded: loaded (/etc/systemd/system/my-script.service; static; vendor preset: enabled)
   Active: inactive (dead) since Sun 2019-03-31 13:47:59 CEST; 18min ago
  Process: 22833 ExecStart=/home/pduck/my-script.sh (code=exited, status=0/SUCCESS)
 Main PID: 22833 (code=exited, status=0/SUCCESS)

Mar 31 13:47:29 host systemd[1]: Starting MyScript...
Mar 31 13:47:59 host systemd[1]: Started MyScript.

Здесь мы видим, что единица таймера включена (значение, что она запустится во время начальной загрузки), и в настоящее время ожидающий в течение 19 минут. В сервисной единице активируют Mon 2019-04-01 13:52:59 приблизительно за 23 часа. Сервисная единица в настоящее время неактивна. (Мой сценарий тестирования, my-script.sh, просто делает a sleep 30.) Мы можем также видеть, что сервисная единица неактивна с тех пор Sun 2019-03-31 13:47:59. Добавление 1 дня и 5 минут дает точно Mon 2019-04-01 13:52:59 который является триггерным временем единицы таймера.

Дополнительные материалы для чтения:

3
ответ дан 1 December 2019 в 09:12

Вместо того, чтобы использовать крон, Вы могли просто запустить персистентный скрипт удара, который спит в течение дня и спустя десять секунд после каждого раза, когда он вызывает Вашу программу:

#/bin/bash

while true
do
    ### invoke your program here ###
    sleep 1d 10s
done
1
ответ дан 1 December 2019 в 09:12

Другие вопросы по тегам:

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