python脚本有效,但heroku崩溃

时间:2018-11-19 14:21:03

标签: python heroku beautifulsoup sendgrid

我正在为我的父亲构建一个应用程序,该应用程序会抓取乐透结果(beautifulsoup)并通过电子邮件发送它们(sendgrid)。我使用heroku定期运行脚本github repo。如果我运行它,它将正常工作。电子邮件将被发送,但是由于dyno restart policy,进程崩溃将重新启动。崩溃不是很糟糕,因为脚本可以完成工作,但是问题是dyno的重启,这导致发送了许多电子邮件。您会在我的仓库中找到该脚本。

我的猜测是漂亮汤和/或sendgrid的异步性。您知道如何在heroku中获得更好的日志信息吗?如果我注释掉实际的电子邮件发送部分并在十分钟后启动调度程序,则它可以工作,而工作程序却不能。

我的Procfile看起来像:

worker: python lotto_mailer.py

这是服务器日志。

Nov 19 05:56:36 lotto-mailer heroku/scheduler.2285: Starting process with command `if [ "$(date +%u)" = 1 ]; then python lotto_mailer.py; fi` 
Nov 19 05:56:37 lotto-mailer heroku/scheduler.2285: State changed from starting to up 
Nov 19 05:56:40 lotto-mailer heroku/scheduler.2285: State changed from up to complete 
Nov 19 05:56:40 lotto-mailer heroku/scheduler.2285: Process exited with status 0 
Nov 19 05:56:41 lotto-mailer app/scheduler.2285: Ziehung vom Samstag, 17.11.2018 
Nov 19 05:56:41 lotto-mailer app/scheduler.2285: Gewinnzahlen: [3, 6, 18, 31, 39, 40] SZ: 5 
... App OUTPUT ...
Nov 19 05:56:41 lotto-mailer app/scheduler.2285: UTC Hour: 13

不要被调度程序运行的命令分散注意力。只在星期一运行。看来只有工作程序崩溃,而不是调度程序崩溃。

Nov 19 06:04:24 lotto-mailer heroku/worker.1: State changed from crashed to starting 
Nov 19 06:04:29 lotto-mailer heroku/worker.1: Starting process with command `python lotto_mailer.py` 
Nov 19 06:04:29 lotto-mailer heroku/worker.1: State changed from starting to up 
Nov 19 06:04:29 lotto-mailer heroku/worker.1: State changed from crashed to starting 
Nov 19 06:04:32 lotto-mailer heroku/worker.1: State changed from up to crashed 
Nov 19 06:04:33 lotto-mailer heroku/worker.1: Process exited with status 0 
Nov 19 06:04:33 lotto-mailer app/worker.1: Ziehung vom Samstag, 17.11.2018 
Nov 19 06:04:33 lotto-mailer app/worker.1: Gewinnzahlen: [3, 6, 18, 31, 39, 40] SZ: 5
... APP  OUTPUT ...

为什么工人要跑?如果您需要更多信息,请让我现在。谢谢您的帮助。

解决方案: :我已经认识到可以停用该工作程序了 here 并让调度程序运行,但问题仍然存在,为什么工作程序会崩溃。

1 个答案:

答案 0 :(得分:0)

worker适用于Web服务/服务器而非CLI应用程序,这就是它崩溃的原因,并且您会收到许多电子邮件,因为如果崩溃,它将自动重新启动。不是必需的worker,您可以删除Procfile或创建可以使用whilesleep进行调度的虚拟服务器。