Python-код, работающий в терминале, но не в cronjob
Я написал код, который будет уведомлять меня, когда он выполняется. Я хочу запускать этот код через каждые полчаса, поэтому создал cronjob. Но код не работает, когда выполняется через cronjob.
Вот мой код:
import sys
import pynotify
if __name__ == "__main__":
if not pynotify.init("icon-summary-body"):
sys.exit(1)
n = pynotify.Notification("Subject","Message","notification-message-im")
n.show() #throws error here
Cronjob:
* * * * * cd /home/username/Documents && /usr/bin/python file.py >> /home/username/Desktop/mylog.log 2>&1
Журнал Cronjob:
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display
warnings.warn(str(e), _gtk.Warning)
Traceback (most recent call last):
File "file.py", line 8, in <module>
n.show()
gio.Error: Cannot autolaunch D-Bus without X11 $DISPLAY
Что может быть возможной причиной того же?
Я пытался с помощью notify2
как хорошо, но безуспешно. Работает в обычном исполнении, но не через cronjob
Вот код notify2:
import notify2
notify2.init('app name')
n = notify2.Notification("Summary","Some body text","notification-message-im")
n.show()
Журналы Cronjob для скрипта notify2:
Traceback (most recent call last):
File "file.py", line 3, in <module>
notify2.init('app name')
File "/usr/local/lib/python2.7/dist-packages/notify2.py", line 93, in init
bus = dbus.SessionBus(mainloop=mainloop)
File "/usr/lib/python2.7/dist-packages/dbus/_dbus.py", line 211, in __new__
mainloop=mainloop)
File "/usr/lib/python2.7/dist-packages/dbus/_dbus.py", line 100, in __new__
bus = BusConnection.__new__(subclass, bus_type, mainloop=mainloop)
File "/usr/lib/python2.7/dist-packages/dbus/bus.py", line 122, in __new__
bus = cls._new_for_bus(address_or_type, mainloop=mainloop)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Как я могу запустить этот код через cronjob?
РЕДАКТИРОВАТЬ
Со следующим кодом:-
import sys
import pynotify
import os
os.environ.setdefault('XAUTHORITY', '/home/user/.Xauthority')
os.environ.setdefault('DISPLAY', ':0.0')
if __name__ == "__main__":
if not pynotify.init("icon-summary-body"):
sys.exit(1)
n = pynotify.Notification("Subject","Message","notification-message-im")
n.show() #throws error here
Я сейчас получаю:-
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display
warnings.warn(str(e), _gtk.Warning)
Traceback (most recent call last):
File "file.py", line 12, in <module>
n.show() #throws error here
gio.Error: Could not connect: Connection refused
2 ответа
Вы пытались вызвать дисплей в вашем cronjob?
Cronjob:
* * * * * DISPLAY=:0.0 python /home/username/Documents/file.py
В своем коде Python вы также можете попытаться вызвать Display в начале:
import os
# environnement vars
os.environ.setdefault('XAUTHORITY', '/home/user/.Xauthority')
os.environ.setdefault('DISPLAY', ':0.0')
Кроме того, pynotify не работает в корне. Таким образом, вы должны написать свой crontab без "sudo"
crontab -e
Попробуйте установить переменную окружения $DISPLAY
* * * * * env DISPLAY=:0 cd /home/username/Documents && /usr/bin/python file.py >> /home/username/Desktop/mylog.log 2>&1