我正在开发一个Django的网页(使用Apache服务器),需要调用一个shell命令来启用/解除一些守护进程。 我正在努力做到这一点
os.system(service httpd restart 1>$HOME/out 2>$HOME/error)
而这个命令不会返回任何东西。 任何想法如何解决这个问题?
我将跳过强烈建议您关于让Web应用程序启动和停止系统进程的含义的部分,并尝试回答这个问题。
您的django应用程序不应该以root用户运行,这可能需要启动和停止服务。 你可以通过以下方法来克服
脚本会是这样的
#!/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)