我创建了 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 的良好介绍。