通过Bash重新启动进程

2024-04-26 06:48:25 发布

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

我正在编写一个Python脚本,它应该能够自动重启。在

这是我在Python脚本中所做的

os.execl('run.sh', '')

我的运行.sh看起来像这样

^{pr2}$

我之所以使用sudo fuser -ku 8000/tcp,是因为它有点简单,因为我的python脚本是唯一一个使用端口8000的脚本。在

当我运行python脚本时,它会执行此操作并停止。在

8000/tcp:             7587(pi)  7596(pi)  7597(pi)  7605(pi)  7606(root)
./run.sh: line 3:  7587 Killed                  python /home/app.py

它从不重新启动python脚本。在


Tags: 端口run脚本osshlinepisudo
3条回答

这并不能完全回答您的问题,但是如果您想要实现的是一个能够在零停机时间内响应TCP请求并能够对其进行更新的服务,那么唯一正确的解决方案就是通过UNIX套接字跨进程传递文件描述符。在

代码的框架可以是这样的:

  • python脚本启动并尝试绑定某个unix套接字。套接字的名称应以零字节开头,因为这将确保进程结束时套接字死亡。(这被称为Linux抽象套接字名称空间)
    • 如果成功,则意味着没有以前运行的服务器实例。将TCP服务器绑定到端口8000并接受连接并处理这些请求。在UNIX套接字上监听下一个python实例的到达。当一个连接到那个UNIX套接字上时,停止接受TCP服务器套接字上的传入连接,然后将该文件描述符传递给下一个实例,然后传递给其他客户端的所有文件描述符(或者,如果请求很快就完成处理)。那就死吧。在
    • 如果失败,则表示存在以前正在运行的实例。然后连接到它,打个招呼,然后让所有的文件描述符都通过它。第一个是TCP服务器套接字,所以开始接受它上的新连接。其他文件描述符是已经连接的客户端的一个。。。在

使用该方法,可以构建真正透明的服务器重启。 您需要一个额外的库来将文件描述符从一个进程传递到另一个进程,就像这样:http://code.google.com/p/python-passfd/

当执行python代码时,它将创建sys.argv。在

when Python is invoked, it sets sys.argv to everything but it's own executable.

所以你需要像os.execlp('python', 'the_directory')

请参阅here了解其工作中的详细答案。在

根据os.execl()文档,此函数将替换当前的Python进程,并且永远不会返回。所以你有这个:

  • Python正在运行,调用exec(运行.sh),现在不再运行
  • 在运行.sh正在运行,出于某些不虔诚的原因使用sudo(同一个用户,没有sudo就可以杀人!),尝试使用Python程序的端口号(?!),并终止它(或者不,因为您根本不处理shell脚本中的错误)。在
  • 在运行.sh(如果在杀戮之后它还活着)尝试启动Python脚本。在

这是一种极其复杂的做事方式。相反,您应该简单地将Python进程替换为自身:

os.execlp('python', '/home/app.py')

{g}你可以用Python来代替当前的代码。有关这方面的详细信息,请参阅此处:Restarting a self-updating python script

相关问题 更多 >