通过Python脚本启动/停止Apache

时间:2015-12-11 11:13:43

标签: python apache service subprocess

在运行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文件包含一行允许我的用户无密码运行这些命令。

2 个答案:

答案 0 :(得分:2)

这两个代码都不起作用(有和没有.communicate())。

您应该使用(假设无密码sudo用于这些命令):

import subprocess
subprocess.check_call("sudo service httpd start".split())

原因:

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

答案 1 :(得分:0)

这种情况有不同的原因: 1.用户处于sudoers并配置为不插入密码。

  1. sudo会记住您的密码一段时间(具体取决于您的系统配置),请参阅:https://unix.stackexchange.com/questions/37299/how-does-sudo-remember-you-already-entered-roots-password
  2. 它是否适用于全新的终端会话?