【问题标题】:Restart Crashed Python Script in Ubuntu?在 Ubuntu 中重新启动崩溃的 Python 脚本?
【发布时间】:2021-10-30 14:15:11
【问题描述】:

我最近一直在使用 AWS 的免费 Web 服务,通过 EC2 在云中运行 python 脚本。我将它设置为使用 Crontab 每天在特定时间开始运行,然后全天运行直到它重新启动。

我遇到的问题是程序很可能会崩溃。我在程序上有一堆错误捕获块,但它们并不总能阻止崩溃。在它崩溃的情况下,我真正想要的是让它重新启动并再次上线,这样我就可以尽可能少地错过。但我不知道该怎么做。

我考虑过包含一堆 Crontab 实例来全天运行它,但这不会只是创建一堆我的脚本实例吗?是否有某种方法可以将其配置为仅在脚本当前未运行时才起作用?

【问题讨论】:

    标签: python linux amazon-web-services ubuntu cron


    【解决方案1】:

    如果它打算一直运行,并且您具有 sudo 访问权限,那么 systemd 可以为您执行此操作。它为您的设置增加了一些复杂性,但这是一个理想的用例。

    这是一个示例my_python.service 文件:

    [Unit]
    Description=My Python Service
    
    [Service]
    Type=simple
    WorkingDirectory=/where/it/runs/from
    ExecStart=/usr/bin/python /path/to/script.py
    User=notroot
    Group=notroot
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    并非所有这些选项都是必需的,但这会满足您的需求,并且会通过 journalctl -u my_python 提供日志记录。

    一一浏览:

    • Description= - 完全是为了你的理智,让它更加自我记录
    • [Service] - 描述 systemd 应该如何运行和控制进程的块
    • Type= - 这是分叉、套接字还是 systemd 应该期待什么样的执行行为。 9/10 这只是 Simple
      WorkingDirectory= - (可选)只是指定应该从哪里运行程序。如果您依赖文件输入或生成文件输出,那么这将非常有帮助
    • StartExec= - 要运行的实际命令。它就像从终端运行它一样工作,除了它需要绝对路径,因此需要完整的 /usr/bin/python。您可能需要运行 which python 以确保路径正确
    • User=/Group= - 这可以防止它以 root 身份运行,这是一种很好的做法
    • Restart=always - 如果我的程序停止运行,我应该什么时候重新启动它?这是您想要的神奇部分,它将让systemd 为您监视进程并在失败时自动尝试重新启动它。如果无法再次启动,它将继续尝试,但会将尝试记录在systemctl status my_python

    最后两行是为了让它在启动的最后阶段运行,你并不需要它们,但它很高兴拥有。当您希望在操作系统启动期间启动某些东西时,它会为您提供帮助。

    一旦你有了这个文件,把它放在systemd的单元目录(​​yum系统是/usr/lib/systemd/system)并运行以下命令:

    • systemctl daemon-reload - 在单元目录中查找新文件和文件更改
    • systemctl enable my_python - 或任何您命名的服务,这会使程序在启动时运行
    • systemctl start my_python - 这实际上运行您的程序并为您监控它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      相关资源
      最近更新 更多