Ich habe einige Schwierigkeiten, diese drei Technologien zusammen zu verwenden.

Cron Eintrag:

* * * * * /usr/bin/python /path/to/python/email/program.py

Python-Programm:

  1 #!/usr/bin/python
  2 
  3 import imaplib
  4 import os
  5 import sys
  6 import pynotify
  7 
  8 if not pynotify.init('Emails'):
  9     sys.exit(1)
 10 
 11 with open('/path/to/python/email/count.tmp', 'r') as file:
 12     data = int(file.read().strip())
 13 client = imaplib.IMAP4_SSL('mail.sever.com', '993')
 14 client.login('user@server.com', 'password')
 15 client.select()
 16 
 17 unseen = client.search(None, 'UnSeen')[1][0].split()
 18 
 19 if unseen[0] == '':
 20     pass
 21 else:
 22     if len(unseen) != data:
 23         n = pynotify.Notification(str(len(unseen) - data) + " New Messages",
 24             str(len(unseen)) + " Unread Messages",
 25             "file:///path/to/python/email/mail.png")
 26         if not n.show():
 27             print "Fail"
 28             sys.exit(1)
 30         with open('/path/to/python/email/count.tmp', 'w') as file:
 31             file.write(str(len(unseen)))

Das Skript funktioniert ordnungsgemäß, wenn es alleine ausgeführt wird, wird jedoch nicht ausgeführt, wenn es als Cron-Job geplant ist. Ich habe das Syslog überprüft und es heißt, dass das Skript ausgeführt wird, und ich habe die Zeile aus dem Protokoll als sudo ausgeführt, um dies zu überprüfen.

Ich habe nachgesehen

Führen Sie Python Script auf Crontab aus

Und

Cron mit Benachrichtigung-Senden

Aber weder noch weitere Links scheinen diese Kombination anzusprechen.

Irgendwelche Gedanken?

-Update 1-

Da pynotify das Programm anscheinend überhaupt nicht funktionieren lässt, habe ich ihre Aufrufe durch einen os.system-Aufruf ersetzt. Zumindest aktualisiert dies die kleine tmp-Datei, aber immer noch keine Benachrichtigung.

os.system('/usr/bin/X11/notify-send "{} New Messages" "{} Unread Messages"'.format(len(unseen) - data, len(unseen))

-Update 2-

/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display
warnings.warn(str(e), _gtk.Warning)

** (other.py:16509): WARNING **: Command line `dbus-launch --autolaunch=91bdcc4a583bfb56734fbe1200000010 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n
1
hyleaus 24 Nov. 2013 im 17:05

3 Antworten

Beste Antwort

Wenn Sie Ihr Programm manuell ausführen, funktioniert dies, da die Variable DISPLAY auf Ihre aktuelle Anzeige gesetzt wird (in den meisten Fällen :0). Wenn Sie das Skript jedoch über cron ausführen, wird keine solche Variable festgelegt und Benachrichtigungen funktionieren nicht.

Wie in dieser Antwort erwähnt, sollten Sie sowohl die Anzeige als auch die Xauthority exportieren und schließlich das Skript als Benutzer ausführen (und nicht als Wurzel).

Versuchen Sie so etwas:

* * * * * export DISPLAY=:0.0 && export XAUTHORITY=/home/<username>/.Xauthority && sudo -u <username> /usr/bin/python /path/to/python/email/program.py

(ändere <username> mit deinem Benutzernamen)

5
Community 23 Mai 2017 im 10:29

Versuchen Sie diesen Befehl:

*\1 * * * * sudo -u user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send 'Hi.'
0
E.Z. 2 Apr. 2018 im 09:38

Ändern Sie Ihren Cron-Eintrag in * * * * * / usr / bin / python /path/to/python/email/program.py >> /var/log/program.log 2> & 1 und sehen Sie, was Sie im Protokolldateiprogramm erhalten .log Sie können Ihrem Programm print-Anweisungen hinzufügen, um das Debuggen zu verbessern (wie Sie sie in program.log erhalten).

1
its me 24 Nov. 2013 im 13:46