解决子进程占有父进程端口的问题

时间:2022-08-28 22:05:55

在Centos服务器中启动一个在web服务,处理消息

其中有个消息需要启动系统的服务如mysqld等

发现启动服务后,关掉web服务,再打开web服务就会提示对应端口已经被占有

应该是子进程继承了父进程的文件描述符,所以虽然web服务关了,mysqld等服务进程里面对应的文件描述符没关闭

系统认为对应的文件没有关闭(linux里面所有的东西都被看成文件,打开的socket说成文件没问题吧)

系统就认为端口还被占用

问题就出在子进程继承了父进程的文件描述符上

查了下资料,python启动子进程的方法主要有3种

os.system()这个函数和c中的os.system()类似,无法对子进程进行控制

os.popen()可以获取子进程的输出

subprocss.Popen()这个函数对子进程的控制选项比较多

subprocess.Popen(args, bufsize=0, 
executable=None, stdin=None, stdout=None, 
stderr=None, preexec_fn=None, 
close_fds=False, shell=False, 
cwd=None, env=None, universal_newlines=False,
 startupinfo=None, creationflags=0)

close_fds=False,把值改为True,会关闭从父进程继承的文件描述符

需要注意的是args参数是个list,命令的参数是多个时不能直接给个字符串,需要转换成['args1','args2'......]这样的格式