Python脚本在终端上运行良好,但从crontab运行时崩溃

问题描述 投票:0回答:1

我有一个简单的python脚本,用于捕获运行Ubuntu的计算机的屏幕截图。我希望它在启动时自动运行,所以我将@reboot python3 /bin/program.py放在crontab的非sudo版本中。

从终端运行时,程序运行正常,但显示错误pyscreenshot.err.FailedBackendError。我将其放在try循环中,并让它将所有异常写入文件,这就是我发现错误消息“所有后端均失败”的方式。

与程序'pyscreenshot'无法正常工作有关。

import pyscreenshot as screen
import os
from numpy import random
from time import sleep
from os.path import expanduser


TMP_SCREEN_PATH = expanduser('~') + '/.UE/tmp.png'
LOG_FILE_PATH = expanduser('~') + '/.UE/log.txt'
GRAB_DELAY_RANGE = (1, 10)


def screenshot(save_path=TMP_SCREEN_PATH):
    img = screen.grab()
    img.save(save_path)


def delay(delay_range):
    sleep_time = random.randint(delay_range[0], delay_range[1])
    print(f"Sleeping for {sleep_time} seconds")
    sleep(sleep_time)


def main():
    try:
        while True:
            screenshot()
            delay(GRAB_DELAY_RANGE)
    except KeyboardInterrupt:
        print("Nope")
        main()
    except Exception as e:
        print(e)
        with open(LOG_FILE_PATH, 'a') as f:
            f.write(str(type(e))+str(e)+'\n')
        sleep(5)
        main()

f = open(LOG_FILE_PATH, 'w+')
f.write('Startup')
f.close()
main()

我需要以下解决方案之一:

  1. 简单地解决问题
  2. 启动时运行程序的另一种方法
  3. 用于截屏的其他模块

感谢您的任何帮助,谢谢

python python-3.x linux ubuntu cron
1个回答
0
投票

如果运行cron作业的用户也已在控制台上登录(您提到了重新启动,所以我猜您已启用自动登录),那么如果您还添加cron作业,则可能会起作用:

os.environ["DISPLAY"] = ":0"

这在Ubuntu上使用cron和脚本的简化版本进行了测试:

import os
import pyscreenshot as screen
os.environ["DISPLAY"] = ":0"
img = screen.grab()
img.save("/tmp/test.png")

如果不适合您,那么您可能还必须尝试将XAUTHORITY环境变量的值设置为在用户交互过程的环境中找到的值,可以使用psutil提取该值。包,但我们希望不需要。

© www.soinside.com 2019 - 2024. All rights reserved.