【问题标题】:Cron scheduler of python script using notify-send使用 notify-send 的 python 脚本的 Cron 调度程序
【发布时间】:2013-11-24 13:05:00
【问题描述】:

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

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 作业时不会运行。我检查了系统日志,它说脚本正在运行,我已经以 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

【问题讨论】:

    标签: python cron


    【解决方案1】:

    当您手动运行程序时,它可以工作,因为变量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
    

    (用您的用户名更改&lt;username&gt;

    【讨论】:

      【解决方案2】:

      将您的 cron 条目更改为 * * * * * /usr/bin/python /path/to/python/email/program.py >> /var/log/program.log 2>&1 看看你在日志文件 program.log 中得到了什么 您可以将打印语句添加到您的程序中以更好地调试(因为您将在 program.log 中获得它们)

      【讨论】:

        【解决方案3】:

        试试这个命令:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            在 Ubuntu 20.04 下,/home/&lt;user&gt;/notify.py 下存储以下 Python 脚本:

            import subprocess
            
            subprocess.Popen(['notify-send', 'Running. Finally.'])
            
            

            成功地从我的用户的 crontab(crontab -e,不是 root)发送了一条消息,其中包含以下条目:

            */1 * * * * export DISPLAY=:0.0 && export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus && /usr/bin/python3 /home/<user>/notify.py
            

            对我来说,DBUS_SESSION_BUS_ADDRESS 参数很重要。没有它的解决方案不起作用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-01-26
              • 1970-01-01
              • 2012-04-24
              • 2013-09-26
              • 2019-10-11
              • 2015-02-19
              • 2018-03-25
              相关资源
              最近更新 更多