用 python popen 后台 启动 appium 之后,出现自动结束进程的情况

python 复制代码
appium_port = get_free_appium_port()
cmd = f"appium -p {appium_port} &"
print(cmd)

subprocess.Popen(
   cmd,
   shell=True,
   # 这里修改
   stdout=open(f"./{appium_port}.log", "a+"),
   stderr=subprocess.STDOUT,
)

python(父进程)用subprocess.Popen新建一个进程(子进程)去开启一个shell, shell新开一个子进程(孙进程)去执行ping www.baidu.com的命令。

由于孙进程ping www.baidu.com一直在执行,就类似于一个daemon程序,一直在运行。

在超时时间后,父进程杀掉了shell子进程,但是父进程阻塞在了p.communicate函数了,是阻塞在了调用wait()函数之前,感兴趣的朋友可以看一下源码_communicate函数,linux系统重点看_communicate_with_poll和_communicate_with_select函数,你会发现是阻塞在了while循环里面,因为父进程一直在获取输出,而孙进程一直像一个daemon程序一样,一直在往子进程的输出写东西,而子进程的文件句柄继承自父进程。

虽然shell子进程被杀掉了,但是父进程里面的逻辑并没有因为子进程被意外的干掉而终止,(因为孙进程一直有输出到子进程的stdout,导致子进程的stdout一直有输出,也就是父进程的stdout也有输出),所以while循环一直成立,就导致了阻塞,进而导致wait()没有被调用,所以子进程没有被回收,就成了僵尸进程。

要完美的解决这个问题就是即要能获取到subprocess.Popen的进程的输出,在超时又要能杀掉子进程,让主进程不被阻塞。

相关推荐
wunaiqiezixin1 天前
MIT 6.S081 xv6 源码精读(Scheduling):sched、scheduler
linux·unix·os·xv6·mit6.s081
wunaiqiezixin11 天前
MIT 6.S081 lazy 前置篇(lab5):缺页异常、惰性分配、写时复制、页面换出
linux·unix·os·xv6·mit6.s081
驱动探索者12 天前
RISC-V 指令集深度解析:从 ISA 到 Zephyr
网络·计算机·操作系统·os
TechEdu20260613 天前
[操作系统]操作系统文件系统与输入输出:架构、行为与调优
操作系统·计算机科学·os
haoly198915 天前
xv6-examples-输出helloworld
os·fork·xv6·文件描述符·dup
无小道18 天前
深入理解 Linux 异步 I/O:从 epoll 到 io_uring
os
wunaiqiezixin19 天前
MIT 6.S081 syscall 实验篇(lab2):System call tracing (moderate)
linux·unix·os·xv6·mit6.s081
^yi1 个月前
【Linux系统编程】对操作系统的理解
linux·运维·服务器·操作系统·系统调用·os
星马梦缘2 个月前
操作系统计算题专项练习(15题)
操作系统·os·银行家算法·段页式
岑梓铭3 个月前
考研408《操作系统》复习笔记,第二章《2.3.3 + 2.3.4 经典同步问题、管程》
笔记·考研·操作系统·408·os