Crontab 作业仅运行一次

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

使用后缀 &,您可以在后台启动 Python 脚本。即使实例被阻止并永远挂起或在几分之一秒内完成,下一个作业也会在一秒后启动。

#!/bin/bash

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

Cron 不适合比分钟更细的时间粒度。Systemd 计时器可用于更细的粒度,但如果您根本不想限制时间,则只需在启动过程中的适当时间启动该作业即可。

由于您的代码使用 DISPLAY=:0,它可能会作为 systemd 单元启动,具体取决于 graphic.target,以避免在图形系统启动之前调用它。

循环脚本可能会随着时间的推移积累大量的时间差异,每小时 3597 次而不是 3600 次,但也许“大约每秒一次”就足够了。如果不是,你必须自己测量时间并自行纠正。

例如,YT 上提供有关 systemd 的良好介绍。

相关内容