Python子进程没有';t重新加载Nginx
在python脚本(3.7)中,我尝试在创建配置后重新加载Nginx:Python子进程没有';t重新加载Nginx,python,python-3.x,nginx,Python,Python 3.x,Nginx,在python脚本(3.7)中,我尝试在创建配置后重新加载Nginx: import sys from urllib.request import Request, urlopen import subprocess import psycopg2 import dns.resolver import logging import os [...] logging.info(hostname+':Preparing co
import sys
from urllib.request import Request, urlopen
import subprocess
import psycopg2
import dns.resolver
import logging
import os
[...]
logging.info(hostname+':Preparing configuration file')
conf = content.replace('%%hostname%%', hostname)
logging.info(hostname+':Creating configuration file')
f = open(hostname + '.conf', 'w+')
f.write(conf)
f.close
subprocess.run(["sudo", "mv", "/home/app/domain_script/"+hostname+".conf", "/etc/nginx/sites-available/"])
subprocess.run(["sudo", "ln", "-s", "/etc/nginx/sites-available/"+hostname+".conf", "/etc/nginx/sites-enabled/"])
subprocess.run(["sudo", "service", "nginx", "reload"])
[...]
但是我注意到Nginx没有被重新加载。配置未激活且未显示任何错误
我试过:
subprocess.run(["sudo", "/usr/sbin/service", "nginx", "reload"])
subprocess.Popen(["sudo", "/usr/sbin/service", "nginx", "reload"])
subprocess.call(["sudo", "/usr/sbin/service", "nginx", "reload"])
同时添加以下内容:time.sleep(10)
一切都没有成功
如果停止脚本,然后手动在shell中键入:服务nginx reload
-它正在工作
如果该命令是要执行的最后一个代码,或者仅在python文件中使用该命令,则该命令有效
用户在sudoer列表中,不需要密码。“子流程”是最重要、文档最完整的模块之一,有大量定制。这也使它成为最具挑战性的项目之一
为了回答你的问题,是一个小实用程序,它在不久前帮助我实现了类似的自动化
导入子流程
导入系统
def外壳输出(参数):
"""
此方法只接受要执行的shell命令并返回
此命令在shell中输出
:param param:command(例如“ls”)
:return:shell上输出的命令字符串
"""
尝试:
x=((subprocess.Popen)(
[str(param)],#将命令的每个部分作为列表元素,
shell=True,#在shell中运行
bufsize=0,
stdout=subprocess.PIPE,#将其赋予管道
stderr=subprocess.PIPE,#也为管道提供错误
universal_newlines=False,#是否包括换行符
)).communicate()[0]#这是从shell获取值
.decode(“utf-8”)#这是为了删除“b”,即从字节转换为字符串
).strip()
返回x。
例外情况除外,如e:
打印(“get_str”+str(e)中执行错误”)
返回e
打印(“可用的文本文件为:\n”+shell\u输出(“ls*txt”))
解决方案:
您的_命令=“service nginx reload”
#这将执行命令,并使用“$”验证其执行
打印(shell_输出(“{};echo$?;”。格式化(您的_命令)))
请尝试一下,如果有帮助,请告诉我:)几个小时后,它最终可以与以下功能一起工作:
subprocess.run(["systemctl", "reload", "nginx"])
检查命令的输出。将
capture\u output=True
传递给run()
调用,获取返回值并检查stdout&stdinIts empty的内容:capture=subprocess.run([“sudo”,“/usr/sbin/service”,“nginx”,“reload”],capture\u output=True)print(capture.stderr)print(capture.stdout)print(capture.stdin)
手动运行服务nginx reload
时,您是使用sudo还是不使用sudo
执行此操作?始终使用sudot。现在有子流程。运行和各种其他方便功能。不需要彻底改造轮子。subprocess.run确实可以继续使用,但需要进行一定数量的改进。reference->,但是subprocess.Popen()是另一个帮助Hanks的实用程序,但我得到了相同的结果。如果链接了几个subprocess.run,似乎不会发生这种情况。我还在调查