Помогите мне настроить задание cron на Ubuntu

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

person sarath    schedule 28.04.2011    source источник
comment
Если я правильно понимаю, ваш cronjob будет работать от имени пользователя root, а у пользователя root нет сеанса X11. Теперь, если мы должны перенести это, это должно быть на SU или SF?   -  person Bobby    schedule 28.04.2011


Ответы (2)


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

Есть несколько решений:

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

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

person dawebber    schedule 28.04.2011
comment
Я уже читал о решении DISPLAY на UbuntuForums, но не пробовал, так как ничего не понял :P. Теперь работает после настройки. спасибо :D */20 * * * * export DISPLAY=:0 && python /home/phantom/Desktop/alarm.py 2>/home/phantom/Desktop/whatswrong.log - person sarath; 28.04.2011
comment
Кстати, могу ли я узнать больше о сеансах X? Любой ресурс? - person sarath; 28.04.2011
comment
@ Сарат, это зависит от того, что ты хочешь знать. Как это относится к DBUS или вообще? - person dawebber; 28.04.2011
comment
@Sarath -- наслаждайтесь чтением, потому что его много :) - person dawebber; 29.04.2011

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

person Senthil Kumaran    schedule 28.04.2011
comment
Я получаю ту же ошибку Senthil. И provide the full path to your system python в смысле? - person sarath; 28.04.2011
comment
Полный путь к исполняемому файлу python, например. /usr/bin/python. - person samplebias; 28.04.2011
comment
@samplebias @Senthil Kumaran да, я получил эту часть, но куда добавить? - person sarath; 28.04.2011
comment
извините, сейчас я не получаю никаких ошибок, но я не смог отобразить заметку, - person sarath; 28.04.2011