Start/Stop Apache 通过 Python 脚本
Start/Stop Apache via Python script
在 RHEL 6.7 服务器上 运行ning Python 2.6.6 我试图在 Python 脚本中以非特权用户身份启动和停止 Apache 网络服务器。
我使用的命令是 "sudo service httpd " 其中参数是 "start"、"stop" 或 "status".
p = subprocess.Popen("sudo service httpd start", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
仅此行是行不通的。添加一个
p.communicate()
让命令按需要工作。谁能告诉我为什么?
更新:
sudoers 文件包含允许我的用户 运行 这些命令无密码的行。
发生这种情况的原因有多种:
1. 用户在 sudoers 中并配置为不输入密码。
- sudo 会记住您的密码一段时间(取决于您的系统配置),请参阅:https://unix.stackexchange.com/questions/37299/how-does-sudo-remember-you-already-entered-roots-password
它可以在全新的终端会话中运行吗?
两个代码都不起作用(有和没有 .communicate()
)。
您应该改用(假设这些命令无密码 sudo
):
import subprocess
subprocess.check_call("sudo service httpd start".split())
原因:
subprocess
函数在默认情况下不 运行 shell 因此字符串被解释为命令的名称:您应该使用列表来传递多个命令行关于 POSIX 的争论
Popen()
启动命令并立即 returns 而不等待它完成,即它可能发生在 httpd 启动之前。假设 Popen()
调用是固定的,.communicate()
等待子进程终止,因此它 returns 在 httpd 启动后(无论成功与否)。
在 RHEL 6.7 服务器上 运行ning Python 2.6.6 我试图在 Python 脚本中以非特权用户身份启动和停止 Apache 网络服务器。
我使用的命令是 "sudo service httpd " 其中参数是 "start"、"stop" 或 "status".
p = subprocess.Popen("sudo service httpd start", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
仅此行是行不通的。添加一个
p.communicate()
让命令按需要工作。谁能告诉我为什么?
更新: sudoers 文件包含允许我的用户 运行 这些命令无密码的行。
发生这种情况的原因有多种: 1. 用户在 sudoers 中并配置为不输入密码。
- sudo 会记住您的密码一段时间(取决于您的系统配置),请参阅:https://unix.stackexchange.com/questions/37299/how-does-sudo-remember-you-already-entered-roots-password
它可以在全新的终端会话中运行吗?
两个代码都不起作用(有和没有 .communicate()
)。
您应该改用(假设这些命令无密码 sudo
):
import subprocess
subprocess.check_call("sudo service httpd start".split())
原因:
subprocess
函数在默认情况下不 运行 shell 因此字符串被解释为命令的名称:您应该使用列表来传递多个命令行关于 POSIX 的争论
Popen()
启动命令并立即 returns 而不等待它完成,即它可能发生在 httpd 启动之前。假设Popen()
调用是固定的,.communicate()
等待子进程终止,因此它 returns 在 httpd 启动后(无论成功与否)。