【问题标题】:How can i keep a python app running 24/7 on host?如何让 python 应用程序在主机上 24/7 全天候运行?
【发布时间】:2021-07-03 13:37:36
【问题描述】:

我写了一个小应用程序,它会抓取我学校的网站,然后查找最后一篇文章的标题,将其与旧标题进行比较,如果不一样,它会向我发送一封电子邮件。 为了让应用程序正常工作,它需要保持 24/7 全天候运行,以便 title 变量的值正确。 代码如下:

import requests
from bs4 import BeautifulSoup
import schedule, time
import sys
import smtplib


#Mailing Info

from_addr = ''
to_addrs = ['']

message = """From: sender
To: receiver
Subject: New Post

A new post has been published
visit the website to view it: 
"""


def send_mail(msg):
    try:
        s = smtplib.SMTP('localhost')
        s.login('email',
         'password')
         
        s.sendmail(from_addr, to_addrs, msg)
        s.quit()
    except smtplib.SMTPException as e:
        print(e)


#Scraping
URL = ''

title = 'Hello World'


def check():
    global title
    global message

    page = requests.get(URL)
    soup = BeautifulSoup(page.content, 'html.parser')

    main_section = soup.find('section', id='spacious_featured_posts_widget-2')
    first_div = main_section.find('div', class_='tg-one-half')

    current_title = first_div.find('h2', class_='entry-title').find('a')['title']

    if current_title != title:
        send_mail(message)
        title = current_title
    else:
        send_mail("Nothing New")


schedule.every(6).hours.do(check)

while True:
    schedule.run_pending()
    time.sleep(0.000001)

所以我的问题是如何使用 Cpanel 保持此代码在主机上运行? 我知道我可以使用 cron 作业每隔 2 小时左右运行一次,但我不知道如何保持脚本本身运行,当我关闭应用程序终止的页面时使用终端不起作用

【问题讨论】:

  • 你应该解释为什么你需要这方面的帮助;是什么阻止它按原样 24/7 运行?看起来它应该已经这样做了。它崩溃了吗?主机是否正在杀死进程?主机偶尔会重启吗?所有这些都可能有不同的解决方案,您可能需要多种解决方案,具体取决于问题所在。
  • 这可能更多是操作系统或 Cpanel 的问题。如果你在 Cpanel 下运行 Linux 服务器,那么让 python 进程永久运行的一种方法是:nohup python yourcode.py > logfile & nohup 在你断开连接时保持进程运行,并且 & 在后台启动它,这样你可以注销。你在 Cpanel 上运行服务器吗??
  • 您可以使用操作系统提供的调度程序,例如,通过 cron 运行您的脚本。

标签: python automation web-hosting smtplib


【解决方案1】:

所以 - 通常要长时间运行程序,它们需要被守护。基本上通过双叉和 set-sid 与您的终端断开连接。话虽如此,我自己从来没有真正做过,因为它通常要么是 (a) 错误的解决方案,要么 (b) 它在重新发明轮子 (https://github.com/thesharp/daemonize)。

在这种情况下,我认为更好的做法是每 6 小时调用一次脚本,而不是让它每 6 小时在内部执行一次操作。让您的程序在重启时恢复弹性几乎是大多数系统保持可靠的方式,并将它们放入自动重启的“摇篮”中。

在您的情况下,我建议将标题保存到文件中,并在调用脚本时读取和写入该文件。这将使您的脚本更简单、更健壮,并且您将使用久经考验的工具来完成这项工作。

几年后,当您编写的代码需要在整个机器崩溃后幸存下来并被替换(在 6 小时内,安装好所有东西)时,您可以改用某种外部形式的存储(如数据库)文件,以使您的系统更具弹性。

【讨论】:

  • 谢谢,这样更有意义!
  • cron 在这种情况下将是首选解决方案。一般来说,可以将服务部分委托给 systemd(无需在脚本中进行去魔化)
  • 同意;如果可用,cron 是用于调度的正确的战斗强化工具。我提到了守护进程,因为即使我不同意这种方法,这个问题确实特别询问了关于连续运行脚本的问题,而且我不确定 systemd 是否可用。我推荐的方法既不需要 systemd 也不需要 daemonize。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
相关资源
最近更新 更多