繁体   English   中英

在 Ubuntu 中重新启动崩溃的 Python 脚本?

[英]Restart Crashed Python Script in Ubuntu?

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

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

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

如果它打算一直运行,并且您有 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 - 这实际上运行您的程序并为您监视它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM