Задание Crontab работает только один раз

Я создал 60 crontab для запуска скрипта python каждые секунд и скриптов python это был всего лишь тест, и он содержит только следующее:

import notify2
from datetime import datetime

notify2.init('')

n = notify2.Notification('test', datetime.now().strftime('%I:%M:%S'))
n.set_timeout(1000)
n.show()

и задание crontab:

* * * * * DISPLAY=':0' XAUTHORITY='/run/user/1000/gdm/Xauthority' python3 /path/to/my/script.py
* * * * * ( sleep 1 && DISPLAY=':0' XAUTHORITY='/run/user/1000/gdm/Xauthority' python3 /path/to/my/script.py )
* * * * * ( sleep 2 && DISPLAY=':0' XAUTHORITY='/run/user/1000/gdm/Xauthority' python3 /path/to/my/script.py )
.
.
.
.
.

первый раз он ждет 1 минуту и ​​запускает их, но не все из них будут выполнены, и они никогда не будут выполняться снова.

Я добавляю задание crontab, чтобы проверить, будет ли оно работать (* * * * * env> /home/hadi/Desktop/env.output) и работало нормально. Вот содержимое выходного файла:

POWERSHELL_TELEMETRY_OPTOUT=1
DOTNET_CLI_TELEMETRY_OPTOUT=1
HOME=/home/hadi
COMMAND_NOT_FOUND_INSTALL_PROMPT=1
LOGNAME=hadi
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
JAVA_HOME=/usr/lib/jvm/jdk-15.0.2
PWD=/home/hadi

Итак, я предполагаю, что проблема в уведомлении, как это исправить?

и еще кое-что, DISPLAY = ': 0' несколько раз я должен установить это 1 не 0 Я не знаю, почему

1
задан 31 July 2021 в 09:53

1 ответ

С постфиксом &, вы можете запустить скрипт Python в фоновом режиме. Даже если экземпляр заблокирован и зависает навсегда или заканчивается за небольшую долю секунды, следующее задание начнется через секунду.

#!/bin/bash

while true 
do
  sleep 1
  python3 /path/to/my/script.py &
done 

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

Поскольку код использует DISPLAY=:0, он может быть запущен как системный блок, в зависимости от graphical.target, чтобы избежать его вызова до того, как графическая система выйдет из строя.

Сценарий циклирования может накапливать большее количество временных расхождений с течением времени и 3597 раз в час вместо 3600, но, возможно, «примерно один раз в секунду» достаточно хорошо. Если нет, вы должны измерить время самостоятельно и исправить себя.

Хорошее введение в systemd доступно, например, на YT.

1
ответ дан 20 August 2021 в 10:30

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

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