使用python重新启动Apache导致端口更改

我正在使用python瓶web框架来创build一个服务pipe理器,所以我已经创buildterminal服务重新启动/停止有线事情,当我使用

os.system('service apache2 restart')

要么

os.system('/etc/init.d/apache2 restart')

apache接pipe我的瓶子应用程序的端口,所以如果我正在运行lsof -i :8080 (8080是我的瓶子应用程序端口)我看

 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME python 27396 root 3u IPv4 1298282 0t0 TCP *:http-alt (LISTEN) apache2 27426 root 3u IPv4 1298282 0t0 TCP *:http-alt (LISTEN) apache2 27428 www-data 3u IPv4 1298282 0t0 TCP *:http-alt (LISTEN) apache2 27429 www-data 3u IPv4 1298282 0t0 TCP *:http-alt (LISTEN) apache2 27430 www-data 3u IPv4 1298282 0t0 TCP *:http-alt (LISTEN) apache2 27432 www-data 3u IPv4 1298282 0t0 TCP *:http-alt (LISTEN) apache2 27433 www-data 3u IPv4 1298282 0t0 TCP *:http-alt (LISTEN) apache2 27435 www-data 3u IPv4 1298282 0t0 TCP *:http-alt (LISTEN) 

文件/ etc / apache2 / ports具有以下内容

 # If you just change the port or add more ports here, you will likely also # have to change the VirtualHost statement in # /etc/apache2/sites-enabled/000-default.conf Listen 80 <IfModule ssl_module> Listen 443 </IfModule> <IfModule mod_gnutls.c> Listen 443 </IfModule> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet 

当然,如果我在shell中运行相同的命令,所有的工作如预期

注意:python脚本以root身份运行

这是因为默认情况下,subprocess会inheritance父级的文件描述符。

由于您的Web应用程序打开了此端口,因此会向运行的Apache Web服务器发送os.system请求。

你需要改变你的python代码来执行以下操作。

  • 调用os.fork()
  • closures您的Web应用程序所使用的侦听服务器端口的文件描述符。 (请注意不要shutdown它。
  • 调用你的os.system()请求。
  • 退出分叉进程。

较新版本的python引入了在所有文件描述符上添加FD_CLOEXEC属性的默认行为,以避免这种行为。 您也可以使用fcntl模块在侦听套接字上执行相同的操作,但这可能会破坏应用程序的其他方面,因此您需要对此进行testing。