帮我在Ubuntu上设置cron任务

0 投票
2 回答
4020 浏览
提问于 2025-04-16 16:35

你好 :) 我想要一个每20分钟提醒一次的应用,所以决定自己用Tomboy笔记来开发一个。我查了一下关于crontab的资料,并通过 sudo crontab -e 命令设置了一个任务。

*/20 * * * * python /home/phantom/Desktop/alarm.py 2>/home/phantom/Desktop/whatswrong.log

我的Python代码大概是这样的:

#!/usr/bin/env python
 import dbus, gobject, dbus.glib
# Get the D-Bus session bus
 bus = dbus.SessionBus()
# Access the Tomboy D-Bus object
 obj = bus.get_object("org.gnome.Tomboy","/org/gnome/Tomboy/RemoteControl")
# Access the Tomboy remote control interface
 tomboy = dbus.Interface(obj, "org.gnome.Tomboy.RemoteControl")
# Display the Start Here note
 tomboy.DisplayNote(tomboy.FindNote("alert"))

我对DBus接口不太了解,但看了一些教程,发现可以用DBus来和Tomboy进行交互,于是写出了上面的代码。

当我手动运行代码时,可以打开Tomboy笔记(提醒信息),但通过cron运行时却出现了我看不懂的错误。请帮帮我。谢谢 :)

Traceback (most recent call last):
File "/home/phantom/Desktop/try.py", line 4, in <module>
bus = dbus.SessionBus()
File "/usr/lib/pymodules/python2.6/dbus/_dbus.py", line 219, in __new__
mainloop=mainloop)
File "/usr/lib/pymodules/python2.6/dbus/_dbus.py", line 108, in __new__
bus = BusConnection.__new__(subclass, bus_type, mainloop=mainloop)
File "/usr/lib/pymodules/python2.6/dbus/bus.py", line 125, in __new__
bus = cls._new_for_bus(address_or_type, mainloop=mainloop)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.Spawn.ExecFailed: /bin/dbus- launch terminated abnormally with the following error: Autolaunch error: X11 initialization failed.

2 个回答

0

不要使用 sudo 来编辑定时任务(crontab),而是直接用 crontab -e 这样可以让定时任务以你的用户身份运行。同时,记得提供你系统中 Python 的完整路径,你可以通过输入 which python 来找到这个路径。

2

根本问题在于,你需要一个正在运行的X会话,而当CRON脚本运行时,它是在没有这个会话的情况下运行的(实际上,它是与任何终端分离运行的)。Dbus可执行文件需要能够初始化X会话(其实并不需要一个正在运行的X)。

这里有几种解决方案:

  • 一个类似的问题在这里有描述。他们的解决方案是运行Xvfb或类似的程序,这样所有进程都可以访问X,即使它们实际上并不显示任何东西。
  • 另一种方法在这里有提到。你可以看看是否只需导出相关的变量(你可以在Python中做到这一点,或者把它们放在CRON启动的脚本里,放在调用Python解释器之前)就能解决你的问题。注意,这个讨论中提到的dbus-launch是一个守护进程启动过程,但dbus-send也是在同一类下。
  • 只需在你的脚本中设置DISPLAY变量,如这里所述。这应该足以让DBUS运行。

我认为第三个解决方案是最简单的,但现在你有不止一个选择。

撰写回答