如何用python正确处理linux上的自动启动和停止

2024-05-14 04:18:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个剧本:“自动运行.py“和”主.py". 我补充道自动运行.py“作为linux系统中自动运行的服务。工作完美!在

现在我的问题是:当我想发射时”主.py“从我的自动运行脚本,和”主.py“将永远运行”自动运行.py“永远不会结束!所以当我这么做的时候

sudo service autorun-test start

命令也永远不会结束!在

我该怎么跑”主.py“然后离开,为了完成它,我怎么能停下来”主.py“何时”自动运行.py以参数“stop”启动?(我认为其他服务都是这样工作的)

编辑:

解决方案:

^{pr2}$

Tags: pytest命令脚本编辑参数linux系统
1条回答
网友
1楼 · 发布于 2024-05-14 04:18:35

首先,如果您试图创建一个系统守护进程,那么您几乎肯定希望遵循PEP 3143,而且您几乎肯定希望使用^{}模块来为您完成此操作。在

When I want to launch "main.py" from my autorun script, and "main.py" will run forever, "autorun.py" never terminates as well!

你没说你是怎么运作的。如果您正在做的任何事情都是将main.py作为子级启动并等待(或者,更糟的是,尝试在同一进程中import/execfile/等等),那么您不能这样做。要么autorun.py必须启动并分离{}(或者通过一些外部工具间接地这样做),要么{}在启动时必须进行守护进程。在

how can I then stop "main.py" when "autorun.py" is launched with the parameter "stop" ?

您需要某种形式的进程间通信(IPC),以及{}找到正确的IPC通道的方法。在

如果您正在构建一个网络服务器,正确的答案可能是作为客户端连接到它。但在其他情况下,最简单的事情就是kill一个带有信号的进程。在

如果您使用的是daemon模块,它可以很容易地将信号映射到回调。或者,如果不需要任何清理,只需使用SIGTERM,默认情况下,它将突然终止。如果这两种方法都不适用,则必须设置一个自定义信号处理程序(并在该处理程序中执行一些有用的操作,例如,设置一个主代码定期检查的标志)。在

你怎么知道要向哪个进程发送信号?标准的方法是让main.py在启动时将其PID记录在一个PID文件中。您可以读取该pid文件,并向其中指定的任何进程发送信号。(如果因为没有具有该PID的进程而出现错误,则意味着守护进程已出于某种原因退出,可能是因为未处理的异常,甚至是segfault。同样,如果你正在使用daemon,它会为你做pidfile的工作;如果不是,你必须自己做。在

您可能需要查看计算机附带的守护程序的服务脚本。它们可能都是用bash而不是Python编写的,但是要弄清楚它们在做什么并不难。或者…只需使用其中一个作为骨架,在这种情况下,您不需要任何bash知识;它只是搜索和替换名称。在

如果您的发行版有LSB样式的init函数,您可以使用类似this example的函数。这本书做的比你需要的多得多,但它是所有细节的一个很好的例子。或者用类似this example的东西从头开始。这一个是从服务脚本执行pidfile管理和后台处理(将非后台程序转换为守护程序),如果正确使用daemon,则不需要这样做,并且它使用SIGHUP而不是SIGTERM。您可以自己搜索init.d服务脚本的其他示例。在

但是,如果您只是想为自己的系统做这件事,最好的做法是查看发行版上的/etc/init.d。这里会有几十个例子,除了守护进程的名称之外,90%的例子都是完全相同的。在

相关问题 更多 >