设置新桌面的怪异行为.背景与cron



我想每5分钟换一次桌面背景。我在ubuntu上,这个工作有效地改变了我的背景:

gsettings set org.gnome.desktop.background picture-uri "file:/img.jpg"

我可以从python脚本中启动它,它将从特定目录中随机选择一个图像。我把脚本放在这里,尽管我不确定它是否相关

import os
import subprocess as sub
import random
files = [f for f in os.listdir('/usr/share/rwallpaper')]
rando = random.randint(0, (len(files) - 1))
cmd = ["gsettings", "set", "org.gnome.desktop.background", "picture-uri"]
wallpaper = ""file:/usr/share/rwallpaper/" + files[rando] + """
cmd.append(wallpaper)
print(" ".join(cmd)) #to remove after
sub.run(cmd)

这个也可以。所以现在我想使用cron来定期执行我的python代码

$ sudo crontab -e
*/5 * * * * python3 /usr/local/cronwal/cronwal.py

不起作用。我发现这可能是用户环境的问题,所以我试着用

之类的东西来改变上面的执行
*/5 * * * * sudo -u "me" python3 /usr/local/cronwal/cronwal.py
*/5 * * * * su me  -c "python3 /usr/local/cronwal/cronwal.py"

是行不通的。要明确的是,在根shell中,原始命令(我的帖子顶部的第一个gsetting命令)或这两个命令也不起作用,这不是cron问题。

所以,我决定使用crontab作为我的用户。可能是用户相关的问题,无法通过su/sudo

解决。I tried this

$crontab -u me -e #in a shell run by "me"
*/5 * * * * python3 /usr/local/cronwal/cronwal.py 

不起作用。更确切地说,我可以在cron服务状态

中看到
févr. 14 18:05:01 florent-NB50TZ CRON[56843]: pam_unix(cron:session): session opened for user root by (uid=0)
févr. 14 18:05:01 florent-NB50TZ CRON[56844]: pam_unix(cron:session): session opened for user florent by (uid=0)
févr. 14 18:05:01 florent-NB50TZ CRON[56843]: pam_unix(cron:session): session closed for user root
févr. 14 18:05:01 florent-NB50TZ CRON[56849]: (florent) CMD (python3 /usr/local/cronwal/cronwal.py )
févr. 14 18:05:01 florent-NB50TZ CRON[56844]: pam_unix(cron:session): session closed for user florent

(i ';me")

一行
(florent) CMD (python3 /usr/local/cronwal/cronwal.py )

暗示,我运行脚本作为florent,所以它应该工作相同的权利?但是没有。即使脚本运行与我的florent shell工作,cron不能工作。

python3 /usr/local/cronwal/cronwal.py
#change of background

**编辑:**我确实改变了行在crontab,所以我可以有反馈。我确实删除了带有选项MAILTO=""的邮件,所以我需要以另一种方式获得反馈。

*/5 * * * * python3 /usr/local/cronwal/cronwal.py >> /home/florent/cronwal.log 2>>/home/florent/cronwal.log

和我想的一样,没有错误输出。我只有print(" ".join(cmd))在日志中。

除了$DISPLAY,您可能需要设置$DBUS_SESSION_BUS_ADDRESS环境,因为gsettings正在使用dbus(发现当不设置DISPLAY时,错误消息谈论无法自动启动D-Bus);你可以试试:

DISPLAY=:0
*/5 * * * * eval $(ps -ww -p $(pgrep gnome-session) -o cmd= e | fmt -1 | grep DBUS_SESSION_BUS_ADDRESS) python3 /usr/local/cronwal/cronwal.py

这将从crontab调用者拥有的gnome-session进程的环境中获取会话地址,并在python3进程的环境中设置它,从而允许分叉的gsettings命令通过会话总线进行通信。

您可以检查DBUS_SESSION_BUS_ADDRESS是否在您的终端中设置了printenv并复制,如果上面有一些语法错误(我没有办法测试),但它不会在下一个gnome会话上工作,当然,如果您像那样硬编码它,您必须每次更改它:

DISPLAY=:0
*/5 * * * * DBUS_SESSION_BUS_ADDRESS="whatever printenv says" python3 /usr/local/cronwal/cronwal.py

只是猜测,但也许gsettings需要您的显示服务器集,只需使您的用户crontab看起来像这样:

DISPLAY=:0
*/5 * * * * python3 /usr/local/cronwal/cronwal.py

对于错误的调用,如果您配置了本地生成的给不合格用户的邮件(尝试echo . | mail -s testing florent进行测试,但需要安装bsd-mailx之类的包进行测试),那么您应该在发送给该用户的电子邮件中看到一个错误,该错误可能会告诉您没有设置DISPLAY。Cron将标准错误和输出发送给运行crontab的用户。

所有的X程序都需要知道显示服务器,以便在其上执行操作。您可以阅读X(7)手册页了解详细信息。通常在X中使用终端时,这个环境变量已经设置好了,但是需要在crontab中提供它。如果您使用的是与:0不同的一个,您可以在相关的X环境中的shell中使用printenv DISPLAY检查它(顺便说一句,:0:0.0相同)。

相关内容

  • 没有找到相关文章