Помогите мне настроить работу cron в Ubuntu - PullRequest
0 голосов
/ 28 апреля 2011

Привет :) Я хотел иметь приложение с уведомлением каждые 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 ]

2 голосов
/ 28 апреля 2011

Фундаментальная проблема заключается в том, что в вашем случае требуется запуск сеанса X, и когда скрипт CRON выполняется, он запускается без такого сеанса (он фактически выполняется отдельно от любого терминала).Исполняемый файл Dbus должен иметь возможность инициализировать сеанс X (на самом деле ему не нужен запущенный X).

Существует несколько решений:

  • Аналогичная проблема: описано здесь .Их решение - запустить Xvfb или аналогичный, чтобы разрешить всем процессам доступ к X, даже если они на самом деле ничего не отображают.
  • Другой подход описан здесь .Понимаете, если только экспорт соответствующих переменных (вы можете сделать это в Python или заключить их в скрипт, который запускает CRON и поместить их прямо перед вызовом интерпретатора python), решает вашу проблему.Обратите внимание, что поток обсуждает dbus-launch, который является процессом запуска демона, но dbus-send находится здесь под тем же зонтиком.
  • Просто установите переменную DISPLAY в вашем скрипте как , описанное здесь ,Этого должно быть достаточно для запуска DBUS.

Я думаю, что третье решение является самым простым, но теперь у вас их больше одного.

0 голосов
/ 28 апреля 2011

Не используйте sudo crontab, а просто введите crontab -e, чтобы crontab запускался как ваш userprofile и предоставил полный путь к вашему системному питону, вы можете получить это which python

...