我有一个 python 脚本,可以不断处理新数据并写入 mongodb。在脚本中,它是一个while
循环和一个sleep
连续运行代码的。
永久运行 Python 脚本、在发生错误时记录错误并在崩溃时重新启动的推荐方法是什么?
node.jsforever
适合吗?我也在同一个 Ubuntu 服务器上运行 node/meteor。
我有一个 python 脚本,可以不断处理新数据并写入 mongodb。在脚本中,它是一个while
循环和一个sleep
连续运行代码的。
永久运行 Python 脚本、在发生错误时记录错误并在崩溃时重新启动的推荐方法是什么?
node.jsforever
适合吗?我也在同一个 Ubuntu 服务器上运行 node/meteor。
supervisord非常适合这种事情。虽然我过去每隔几分钟检查一次程序是否仍在运行cron
作业,但 supervisord 在进程内线程中运行所有程序,因此如果您的程序终止,supervisord 将自动重新启动进程。我不再需要解析输出ps
来查看程序是否崩溃。
它有一个简单的声明性配置文件和可配置的日志记录。默认情况下,它会创建一个日志文件,your-program-name-stderr.log
your-program-name-stdout.log
当从 OS 包管理器(对我来说是 Debian)安装 supervisord 时,logrotate 会自动处理该日志文件。
如果您不想配置supervisord
的日志记录,则应该查看 python 中的日志记录,以便您可以控制进入这些文件的内容。
如果您使用的是 debian 衍生产品,您应该能够简单地通过apt-get install supervisord
以 root 身份执行来安装和启动守护进程。
配置文件也非常简单:
[program:myprogram]
command=/path/to/my/program/script
directory=/path/to/my/program/base
user=myuser
autostart=true
autorestart=true
redirect_stderr=True
supervisorctl
还允许您以交互方式查看程序正在执行的操作,并且可以使用supervisorctl start myprogram
etc启动和停止多个程序
最近写了类似的东西。我遵循的基本模式是
while True:
try:
#functionality
except SpecificError:
#log exception
except: #catch everything else
finally:
time.sleep(600)
要处理重新启动,您可以使用 init.d 或 cron 作业。
如果您正在编写守护程序,您可能应该使用以下命令: http: //manpages.ubuntu.com/manpages/lucid/man8/start-stop-daemon.8.html
您可以从 System V /etc/init.d/ 脚本中生成它,或者使用正在慢慢替换它的 Upstart。
新贵:http ://upstart.ubuntu.com/getting-started.html
系统五:http ://www.cyberciti.biz/tips/linux-write-sys-v-init-script-to-start-stop-service.html
我发现 System V 更容易编写,但如果这将被打包并分发到 debian 文件中,我建议编写一个 Upstart conf。
绝对保持睡眠,这样它就不会控制 CPU 负载。
我不知道这是否仍然与您相关,但我一直在阅读有关如何做到这一点的文章,并想在某处分享我所做的。
对我来说,目标是让 python 脚本始终运行(在我的 Linux 计算机上)。python脚本还有一个“while True”循环,理论上应该永远运行,但如果它出于任何我想不到的原因会崩溃,我希望脚本重新启动。此外,当我重新启动计算机时,它应该运行脚本。
我不是专家,但对我来说最好和最容易理解的是使用 systemd(假设您使用 Linux)。
这里和这里有两个很好的例子来说明如何做到这一点,展示了如何在 /etc/systemd/system 或 /lib/systemd/system 中编写 .service 文件。如果你想完全正确,你应该采取前者:
" /etc/systemd/system/: 系统管理员安装的单元" 1
即使您不是专家,这里的 systemd 文档实际上也很容易阅读。
希望这对某人有帮助!