使用notify-send的python脚本的Cron调度程序

时间:2013-11-24 13:05:00

标签: python cron

我在使用这三种技术时遇到了一些困难。

Cron条目:

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

Python程序:

  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)))

该脚本在单独运行时可正常工作,但在作为cron作业计划时不会运行。我检查了syslog,它说脚本正在运行,我从日志中运行sudo来验证。

我已经检查了

Execute python Script on Crontab

Cron with notify-send

但是没有,也没有进一步的链接似乎解决这个组合。

有什么想法吗?

- 更新1 -

由于pynotify似乎根本不允许该程序工作,我已经用os.system调用替换了它们的调用。至少这会更新小tmp文件,但仍然没有通知。

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

- 更新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

4 个答案:

答案 0 :(得分:5)

当您手动运行程序时,它的工作原理是因为变量DISPLAY被设置为当前显示(在大多数情况下为:0),但是当通过cron运行脚本时,没有这样的设置变量并且通知不起作用。

this answer所述,您应该导出显示和Xauthority,最后以用户身份运行脚本(而不是root用户)。

尝试这样的事情:

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

(使用您的用户名更改<username>

答案 1 :(得分:1)

将您的cron条目更改为 * * * * * / usr / bin / python /path/to/python/email/program.py&gt;&gt; /var/log/program.log 2&gt;&amp; 1 并查看日志文件program.log中的内容 您可以将print语句添加到程序中以便更好地进行调试(因为您将在program.log中获取它们)

答案 2 :(得分:0)

尝试此命令:

*\1 * * * * sudo -u user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send 'Hi.'

答案 3 :(得分:0)

在对另一个 question 的回答中,我描述了一个通用的 notify-desktop github gist,用于 cron 和计时器作业。该脚本处理识别桌面用户并为 Wayland 和 X11 提供解决方案。