【问题标题】:Why does running script with sudo or scheduled with crontab cause errors? [duplicate]为什么使用 sudo 运行脚本或使用 crontab 调度会导致错误? [复制]
【发布时间】:2019-12-19 16:45:39
【问题描述】:

我在 python 中有一个简单的脚本来更改桌面墙纸。 它在终端中执行时工作为: ./script.py 因为它有一个适用于 python3 的 shebang。但是,如果我尝试将其作为 sudo ./script.py 运行或尝试使用 cron 安排脚本,则该脚本不起作用。 我是 linux 和 python 的新手,我做了一些阅读,并认为它与 PATH 或 env 有关,但我不确定。

这是在树莓派上更改我的壁纸的 python 脚本:

#!/usr/bin/env python3


import os,random
import subprocess as sub


random_pic = random.choice(os.listdir('/usr/share/rpd-wallpaper/'))

print(random_pic)

shell_command = ("pcmanfm --set-wallpaper /usr/share/rpd-wallpaper/" + str(random_pic))


# open a terminal and changes wallpaper with path of picture above

sub.call('lxterminal -e bash -c "{0}; sleep 5; echo background changed...; pwd; whoami; sleep 1; exec bash"'.format(shell_command), shell=True)

这是我添加的 crontab 行:

*/1 * * * * env DISPLAY=:0 /usr/bin/python3 woll.py

当脚本以 sudo 运行或每分钟被 cron 调用时,它会在终端中给我一个奇怪的错误:

** Message: 08:41:35.152: x-terminal-emulator has very limited support, consider choose another terminal

可能是什么问题,当以 sudo/cron 运行时,找不到程序“pcmanfm”(树莓派的默认文件/窗口管理器)的 PATH? cron 是否作为 sudo 运行?我尝试通过告诉同一个终端返回“whoami”并返回 pi 来调试它,这应该可以正常工作,因为我可以通过普通终端作为我的普通用户帐户“pi”执行脚本,而不是作为 root 并且脚本可以工作.我很困惑。

【问题讨论】:

  • 你能测试which pcmanfm和sudo which pcmanfm吗?
  • 两者都返回:/usr/bin/pcmanfm
  • 建议重复的解决方案是添加DISPLAY,但这里的 OP 已经在这样做了。这可能是其他问题的重复,并且可能正确的答案是“看在上帝的份上,不要从 cron 运行 终端 来更改您的墙纸”。
  • 谢谢 alfasin,那个链接帮助了我!
  • 终端带来什么可能的好处?只需直接从 Python 脚本运行命令即可。

标签: python linux bash cron raspberry-pi


【解决方案1】:

所以现在我的背景改变的方式是: crontab --> 执行具有特殊命令的 bash 脚本,参见:

Pcmanfm set wallpaper fails on Raspbian stretch in cron

--> bash 脚本执行 python 脚本 --> python 脚本打开带有更改后台命令的终端。

感谢大家的帮助!在此过程中了解了一些关于 linux 和 python 的知识,谁知道自动更换壁纸会如此困难。花了我2天,但该死的感觉很好 准备好伊隆我来了

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 2014-10-22
    • 1970-01-01
    • 2020-06-20
    • 2022-06-15
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多