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 中并配置为不输入密码。

  1. 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())

原因:

  1. subprocess 函数在默认情况下不 运行 shell 因此字符串被解释为命令的名称:您应该使用列表来传递多个命令行关于 POSIX
  2. 的争论
  3. Popen() 启动命令并立即 returns 而不等待它完成,即它可能发生在 httpd 启动之前。假设 Popen() 调用是固定的,.communicate() 等待子进程终止,因此它 returns 在 httpd 启动后(无论成功与否)。