在运行Python 2.6.6的RHEL 6.7服务器上,我试图以Python脚本中的非特权用户身份启动和停止Apache Web服务器。
我使用的命令是“sudo service httpd”,其中参数是“start”,“stop”或“status”。
p = subprocess.Popen("sudo service httpd start", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
仅此一行不起作用。添加
p.communicate()
让命令按需运行。有人可以告诉我为什么吗?
更新 sudoers文件包含一行允许我的用户无密码运行这些命令。
答案 0 :(得分:2)
这两个代码都不起作用(有和没有.communicate()
)。
您应该使用(假设无密码sudo
用于这些命令):
import subprocess
subprocess.check_call("sudo service httpd start".split())
原因:
subprocess
函数不运行shell,因此该字符串被解释为命令的名称:您应该使用列表在POSIX上传递多个命令行参数Popen()
启动命令并立即返回而不等待它完成,即,它可能在httpd启动之前发生。假设Popen()
调用已修复,.communicate()
等待子进程终止,因此它在httpd启动后返回(无论是否成功)。答案 1 :(得分:0)
这种情况有不同的原因: 1.用户处于sudoers并配置为不插入密码。
它是否适用于全新的终端会话?