Ubuntu20.04中crontab运行Python Tkinter脚本无窗口显示如何解决
问题原因
cron 运行定时任务时使用独立的最小化非交互环境,不会继承图形桌面会话的环境变量,Tkinter 找不到可连接的显示服务,进程虽然被正常触发,但会因无法连接GUI后端静默失败,不会弹出窗口。
排查步骤
- 先重定向任务输出到日志文件,确认具体报错:将crontab中的任务修改为如下形式,把标准输出、标准错误都写入指定日志文件
* * * * * /usr/bin/python3 /home/francisco/Desktop/fcoterroba/personalProjects/myShit/kinter.py >> /tmp/kinter_cron.log 2>&1
等1分钟任务触发后,查看/tmp/kinter_cron.log内容,通常会看到_tkinter.TclError: no display name and no $DISPLAY environment variable的报错,即可确认是显示环境缺失导致的问题。
- 在桌面正常打开的终端中执行
echo $DISPLAY,记录返回值,本地桌面登录场景下该值通常为:0。 - 终端执行
xhost +local:,给本地用户开放X显示服务的访问权限,避免权限拦截导致连接失败。
解决方案
方法1:在crontab中全局配置GUI所需环境变量
执行crontab -e编辑任务,在所有定时任务的最上方添加环境变量配置:
DISPLAY=:0 XAUTHORITY=/home/francisco/.Xauthority
如果当前使用Wayland显示会话(Ubuntu 20.04可在设置-关于中查看),额外添加Wayland相关变量,变量值可通过终端执行echo $WAYLAND_DISPLAY获取,默认通常为wayland-0:
WAYLAND_DISPLAY=wayland-0
保存退出后cron会自动加载新配置,下次任务触发时即可正常弹出Tkinter窗口。
方法2:执行命令时临时指定环境变量
如果不想修改crontab全局环境,可直接在执行脚本的命令前拼接环境变量,无需额外全局配置:
* * * * * DISPLAY=:0 XAUTHORITY=/home/francisco/.Xauthority /usr/bin/python3 /home/francisco/Desktop/fcoterroba/personalProjects/myShit/kinter.py
注意事项
- 不要用root身份(即
sudo crontab -e)配置该定时任务,root用户默认没有当前桌面会话的访问权限,会被X服务拦截,使用登录桌面的普通用户身份编辑crontab即可。 - 定时任务触发时必须处于已登录图形桌面的状态,如果处于未登录、tty文本界面、锁屏未进入桌面的状态,显示服务未对应用户会话开放,窗口依然无法弹出。
- 如果
xhost +local:配置重启后失效,可以将该命令添加到桌面开机启动项中,开机自动执行开放本地访问权限。 - cron默认的PATH环境变量很短,脚本、解释器、相关依赖路径都尽量写绝对路径,避免出现找不到文件的问题。
内容的提问来源于stack exchange,提问作者fcoterroba
相关产品推荐
相关产品推荐

