我正在使用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() shutdown它。 os.system()请求。 较新版本的python引入了在所有文件描述符上添加FD_CLOEXEC属性的默认行为,以避免这种行为。 您也可以使用fcntl模块在侦听套接字上执行相同的操作,但这可能会破坏应用程序的其他方面,因此您需要对此进行testing。