【问题标题】: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 - 这实际上运行您的程序并为您监控它。