在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'......]这样的格式