Запустите команду оболочки из Django - PullRequest
3 голосов
/ 14 июня 2010

Я разрабатываю веб-страницу в Django (с использованием сервера Apache), которая должна вызвать команду оболочки для включения / отключения некоторых демонов. Я пытаюсь сделать это с

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

и эта команда ничего не возвращает. Любая идея, как я могу это исправить?

Ответы [ 3 ]

7 голосов
/ 14 июня 2010

Я пропущу ту часть, в которой настоятельно рекомендую вам узнать, как веб-приложение запускает и останавливает системные процессы, и постараюсь ответить на вопрос.

Ваше приложение django не должно запускаться с * 1003.* root user, который, вероятно, понадобится для запуска и остановки служб.Вероятно, вы можете преодолеть это путем:

  • создания сценария, использующего 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), вы должны запустить в оболочке от имени 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, поэтому на практике вы убьете свое собственное веб-приложение.

3 голосов
/ 14 июня 2010

Попробуйте запустить команду в оболочке:

import subprocess
r = subprocess.call("service httpd restart 1>$HOME/out 2>$HOME/error", shell=True)
2 голосов
/ 14 июня 2010

Вот код, который я использую для запуска процесса из моего приложения 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.Есть документация для подпроцесса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...