【问题标题】:Python script runs fine from terminal but crashes when run from crontabPython 脚本从终端运行良好,但从 crontab 运行时崩溃
【发布时间】:2020-09-09 06:05:32
【问题描述】:

我有一个简单的 python 脚本,可以截取运行 Ubuntu 的计算机的屏幕截图。我想让它在启动时自动运行,所以我把@reboot python3 /bin/program.py放在了非sudo版本的crontab中。

程序从终端运行时运行良好,但出现错误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】:

    如果运行 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 环境变量的值设置为在用户交互进程的环境中找到的值,可以使用 @987654324 提取@package,但我们希望这不是必需的。

    【讨论】:

    • 非常感谢。我真的很感谢你花时间为我解决这个问题。你愿意解释它在做什么/为什么有效吗?你不必这样做,但我会很感激的。再次感谢。
    • @l-d 它是一个 X 客户端应用程序,因此它需要设置 DISPLAY 变量才能知道要与哪个 X 服务器通信。 :0 用于本地机器上的默认显示。此变量在窗口环境中自动设置,但通常不会在 cron 环境中设置。
    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2014-01-02
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多