繁体   English   中英

从Django运行shell命令

[英]Run a shell command from Django

我正在Django中开发一个网页(使用apache服务器),需要调用shell命令来启用/禁用某些守护进程。 我试着这样做

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

并且此命令不返回任何内容。 知道我该如何解决这个问题?

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

您的django应用程序不应与root用户一起运行,这可能是启动和停止服务所必需的。 您可以通过以下方式克服此问题

  • 创建一个使用seteuid的脚本
  • 给该文件设置set 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),您必须在shell中以root身份运行:

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

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

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

尝试在Shell中运行命令:

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

这是我从我的django应用程序启动过程中使用的代码:

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

在你的情况下,它将是:

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

(你还需要处理stdout和stderr - 不确定添加'1> $ HOME / out')是否适用于Popen。 子进程的文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM