【问题标题】:Trying to run a python script from ubuntu crontab尝试从 ubuntu crontab 运行 python 脚本
【发布时间】:2013-07-05 06:43:00
【问题描述】:

嘿,我在尝试使用 ubuntu 中的 python 脚本运行 cron 作业时遇到了问题。这就是我所做的:

1.) 编写了一个简单的 tkinter 应用程序:代码源来自这个 url - http://www.ittc.ku.edu/~niehaus/classes/448-s04/448-standard/simple_gui_examples/sample.py

#!/usr/bin/python
from Tkinter import *
class App:
    def __init__(self,parent):
        f = Frame(parent)
        f.pack(padx=15,pady=15)
        self.entry = Entry(f,text="enter your choice")
        self.entry.pack(side= TOP,padx=10,pady=12)
        self.button = Button(f, text="print",command=self.print_this)
        self.button.pack(side=BOTTOM,padx=10,pady=10)
        self.exit = Button(f, text="exit", command=f.quit)
        self.exit.pack(side=BOTTOM,padx=10,pady=10)

    def print_this(self):
        print "this is to be printed"

root  = Tk()
root.title('Tkwidgets application')
app = App(root)
root.mainloop()

2.) 将脚本更改为可执行:

chmod 777 sample.py

3.) 将脚本添加到我的 cronjob 中,以便每分钟运行一次以进行测试。我打开 crontab -e 并将以下内容添加到我的文件中:

 * * * * * /home/bbc/workspace/python/tkinter/sample.py 

4.) 免责声明:我没有为 tkinter 添加任何额外的环境变量,也没有在 /etc/init.d/cron 更改我的 cronjob 脚本

5.) 我通过 tail -f /var/log/syslog 跟踪 cron 作业

$ tail -f /var/log/syslog
Jul  7 18:33:01 bbc CRON[11346]: (bbc) CMD (/home/bbc/workspace/python/tkinter/sample.py)
Jul  7 18:33:01 bbc CRON[11343]: (CRON) error (grandchild #11344 failed with exit status 1)
Jul  7 18:33:01 bbc CRON[11343]: (CRON) info (No MTA installed, discarding output)
Jul  7 18:33:01 bbc CRON[11342]: (CRON) error (grandchild #11346 failed with exit status 1)
Jul  7 18:33:01 bbc CRON[11342]: (CRON) info (No MTA installed, discarding output)

任何有关调试此问题的帮助将不胜感激...

【问题讨论】:

  • 您能否更具体地说明您预期会发生什么?我不确定您要寻求帮助的问题是什么。
  • 我正在尝试 gui 部分来提示我的屏幕。我已更改 print_this 方法以从文本框中获取输入并写入文件。我担心的是我的脚本会抛出一个--“错误(孙#11475 失败,退出状态为 1)”
  • 当您说“将脚本添加到我的 cronjob”时 - 哪个 cronjob? /etc/cron.d 下的东西?你来自crontab -e的个人crontab?
  • 我用正确的缩进编辑了 src。我没有在 /etc/cron.d 下添加任何新脚本我使用了 crontab -e 并添加了我在步骤 3 的描述中提供的行。
  • @James 嘿,我终于让它工作了。您通过询问使用哪种显示器为我指明了正确的方向。在谷歌搜索后在 GUI 应用程序下找到了这个help.ubuntu.com/community/CronHowto,他们要求添加 cron 与 env DISPLAY=:0.0 gui_appname 这有效。谢谢

标签: python ubuntu cron tkinter


【解决方案1】:

我不确定您期望在这里发生什么。 cronjob 将无法访问可以显示 GUI 的显示器,因此永远不会显示按钮,因此永远不会运行 print_this

FWIW,当我尝试运行您的代码时出现错误:

  File "./t.py", line 4
    def __init__(self,parent):
      ^
IndentationError: expected an indented block

不确定这是否只是由于复制/粘贴到页面中造成的,还是您的代码确实存在问题。

【讨论】:

  • 我正在尝试 gui 部分来提示我的屏幕。我已更改 print_this 方法以从文本框中获取输入并写入文件。我担心的是我的脚本抛出错误(孙#11475 失败,退出状态为 1)
  • 我的示例代码是这个 url 代码的清理版本 - ittc.ku.edu/~niehaus/classes/448-s04/448-standard/…
【解决方案2】:

在 linux mint 17 中,我必须执行以下操作:

使脚本可执行
~$chmod +x script.py

您必须为 localhost 启用 X ACL 才能连接到 GUI 应用程序才能工作
~$ xhost +本地:

在 crontab 中添加以下行“env DISPLAY=:0.0”
* * * * * env DISPLAY=:0.0 /usr/bin/python /your-script-somewhere.py

还有一行到 crontab ">/dev/null 2>&1"
* * * * * env DISPLAY=:0.0 /usr/bin/python /your-script-somewhere.py >/dev/null 2>&1

您可以检查 /var/log/syslog 文件中的错误
~$ tail -20 /var/log/syslog

更多信息:
https://help.ubuntu.com/community/CronHowto

【讨论】:

  • 非常感谢 xhost +local:顺便说一句,我认为我们应该删除 env DISPLAY=:0.0 中的 env
  • 谢谢!我能够使用此解决方案解决我的问题。非常感谢!
【解决方案3】:

我使用 crontab 来运行一个 bash 文件

30 12 * * 1,2,3,4,5 /home/edward/SSF/SW/EODWD.sh

在终端 -- 使用 crontab -e

bash 文件可以执行任意数量的其他程序

/home/edward/SSF/SW/EODWD.py >> /home/edward/Desktop/eodmail.log 等等

此示例还将 EODWD.py 中的所有打印语句自动发送到日志文件

等待语句在执行下一个命令之前强制竞争

只有在两个文件( *.py 和 *.sh )都可以执行时才有效

【讨论】:

  • 错字等待应该在自己的一行
猜你喜欢
  • 2017-11-11
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2017-12-16
  • 1970-01-01
  • 2016-07-19
相关资源
最近更新 更多