Я создал 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
Я не знаю, почему
С постфиксом &, вы можете запустить скрипт Python в фоновом режиме. Даже если экземпляр заблокирован и зависает навсегда или заканчивается за небольшую долю секунды, следующее задание начнется через секунду.
#!/bin/bash
while true
do
sleep 1
python3 /path/to/my/script.py &
done
Крон не подходит для гранулирования более тонкого времени, чем минутный. Системные таймеры можно использовать для более тонкой грануляции, но если вы вообще не хотите ограничивать время, задание следует просто запустить, когда это уместно в проекте запуска.
Поскольку код использует DISPLAY=:0, он может быть запущен как системный блок, в зависимости от graphical.target, чтобы избежать его вызова до того, как графическая система выйдет из строя.
Сценарий циклирования может накапливать большее количество временных расхождений с течением времени и 3597 раз в час вместо 3600, но, возможно, «примерно один раз в секунду» достаточно хорошо. Если нет, вы должны измерить время самостоятельно и исправить себя.
Хорошее введение в systemd доступно, например, на YT.