从Django运行一个shell命令

我正在开发一个Django的网页(使用Apache服务器),需要调用一个shell命令来启用/解除一些守护进程。 我正在努力做到这一点

os.system(service httpd restart 1>$HOME/out 2>$HOME/error)

而这个命令不会返回任何东西。 任何想法如何解决这个问题?

Solutions Collecting From Web of "从Django运行一个shell命令"

我将跳过强烈建议您关于让Web应用程序启动和停止系统进程的含义的部分,并尝试回答这个问题。

您的django应用程序不应该以root用户运行,这可能需要启动和停止服务。 你可以通过以下方法来克服

  • 创建一个使用seteuid的脚本
  • 给这个文件设置uid属性

脚本会是这样的

 #!/usr/bin/python <- or wherever your python interpreter is import os os.seteuid(0) os.system("service httpd restart 1>$HOME/out 2>$HOME/error") 

要允许将有效的UID设置为root(0),必须以root身份在shell中运行:

 chown root yourscript.py chmod u+s yourscript.py chmod a+x yourscript.py 

这应该做到这一点。 在Django应用程序中,您现在可以调用os.system('yourscript.py')以root权限运行该命令。

最后,我相信你传递给os.system()的命令不是你要找的,因为你谈论启用和禁用守护进程,所有你正在做的是重新启动apache …这反过来似乎是你的django正在运行的地方,所以在实践中,你会杀死自己的web应用程序。

以下是我用于从我的一个Django应用程序启动过程的代码:

  import subprocess process = subprocess.Popen(['python', 'manage.py', 'some_command']) 

在你的情况下,这将是:

 import subprocess process = subprocess.Popen(['service', 'httpd', 'restart']) 

(也需要处理标准输出和标准错误 – 不知道添加'1> $ HOME / out')是否适用于Popen。 有子进程的子进程

尝试在Shell中运行命令:

 import subprocess r = subprocess.call("service httpd restart 1>$HOME/out 2>$HOME/error", shell=True)