当前位置: 首页 > 面试题库 >

Python运行守护程序子进程并读取stdout

秦天宇
2023-03-14
问题内容

我需要运行一个程序并将其输出收集到stdout。这个程序(socat)需要在python脚本期间在后台运行。Socat一旦运行,便处于dameon模式,但首先,它将向我的其余脚本输出一些行到stdout。

命令: socat -d -d PTY: PTY:

输出:

2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/1
2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/2
2011/03/23 21:12:35 socat[7476] N starting data transfer loop with FDs [3,3] and [5,5]

我基本上想在程序开始时运行它,并保持运行直到脚本终止,但是我需要将两个/ dev / pts / X名称读入python。

谁能告诉我该怎么做?

我想出了这个挂起的东西,我想是因为它阻塞了子进程的终止。

#!/usr/bin/python
from subprocess import Popen, PIPE, STDOUT

cmd = 'socat -d -d PTY: PTY: &'

p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
output = p.stdout.read()

# Process the output 
print(output)

谢谢你的帮助

编辑:似乎它可能写入stderr,但是该脚本仍然挂起,并且没有从stderr读取&甚至读取数据。


问题答案:
#!/usr/bin/python
from subprocess import Popen, PIPE, STDOUT
import pty
import os

cmd = 'socat -d -d PTY: PTY:'

master, slave = pty.openpty()

p = Popen(cmd, shell=True, stdin=PIPE, stdout=slave, stderr=slave, close_fds=True)
stdout = os.fdopen(master)
print stdout.readline()
print stdout.readline()

您的版本有两个问题。首先,您调用无参数的read,这意味着它将尝试读取所有内容。但是由于socat不会终止,所以它永远不会决定已读取所有内容。通过使用readline,python只会读取直到找到换行符。根据我对您问题的了解,这就是您所需要的。

第二个问题是C标准库将缓冲管道上的输出。我们通过使用openpty()函数创建一个pty并将其传递给子进程的stdout和stderr来解决该问题。我们使用fdopen使该文件描述符成为常规的python对象,并摆脱了缓冲。

我不知道您在用socat做些什么,但是我想知道是否可以使用pty模块代替它。您正在将一个pty复制到另一个pty,而openpty正在创建一对pty。也许您可以直接使用它们?



 类似资料:
  • 本文向大家介绍python实现守护进程、守护线程、守护非守护并行,包括了python实现守护进程、守护线程、守护非守护并行的使用技巧和注意事项,需要的朋友参考一下 守护进程 1、守护子进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allow

  • 问题内容: 我编写了一个作为守护程序运行的小型Python应用程序。它利用线程和队列。 我正在寻找更改此应用程序的常规方法,以便可以在其运行时与其进行通信。通常,我希望能够监控其健康状况。 简而言之,我希望能够执行以下操作: 稍后,我希望能够进行以下操作: 明确地说,实现Django启发式语法没有任何问题。我不知道该怎么做是将信号发送到守护进程(启动),或者如何编写守护进程来处理和响应此类信号。

  • 守护(Daemon)进程 我们可以认为守护进程就是后台服务进程,因为它会有一个很长的生命周期提供服务,关闭终端不会影响服务,也就是说可以忽略某些信号。 实现守护进程 首先要保证进程在后台运行,可以在启动程序后面加&,当然更原始的方法是进程自己fork然后结束父进程。 if (pid=fork()) { exit(0); // Parent process } 然后是与终端、进程组、会话(Ses

  • Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。 Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。 Daemonset典型用法如下: 在每个节点上运行集群存守护进程 在每个节点上运行日志收集守护进程 在每个节点上运行

  • 建议使用 systemd 管理我们的服务进程。 可以参考swoole官方文档 使用方法 请确保cabal.php配置文件中的swoole.daemonize配置为关闭状态(0或false)! 'swoole' => [ // ... 'daemonize' => 0, // ... ], 在 /etc/systemd/system/目录中,创建一个 cabal.

  • 命令模式 守护进程方式启动:bin/imi server/start -d 重定向标准输入输出:bin/imi server/start -d 文件名.log 此方法只可让服务在后台运行,退出 ssh 后不被终止。 无法在服务崩溃后重新拉起,建议使用 systemd Systemd Systemd 一般都已经集成在了现代 Linux 发行版中,使用它可以实现开机自启动和守护进程等功能。 但 Sys