удаленно запускать программу Python в фоновом режиме - PullRequest
3 голосов
/ 05 июня 2011

Мне нужно использовать fabfile, чтобы время от времени запускать какую-то программу в удаленных блоках и получать результаты. Поскольку выполнение программы занимает много времени, я хочу, чтобы она работала в фоновом режиме, и мне не нужно ждать. Поэтому я попытался os.fork (), чтобы он работал. Проблема в том, что когда я запускаю ssh в удаленном окне и запускаю там программу с os.fork (), программа может нормально работать в фоновом режиме, но когда я попытался использовать запуск fabfile, sudo для удаленного запуска программы, os. fork () не может работать, программа просто тихо умирает. Поэтому я переключился на Python-демон, чтобы демонизировать программу. В течение долгого времени это работало отлично. Но теперь, когда я начал делать свою программу для чтения некоторых полок Python, python-daemon больше не может работать. Похоже, если вы используете python-daemon, полочные инструкции не могут быть загружены правильно, что я не знаю почему. У кого-нибудь есть идея, кроме os.fork () и Python-daemon, что еще я могу попытаться решить мою проблему?

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Если я правильно понимаю ваш вопрос, я думаю, вы делаете это слишком сложным. os.fork() для многопроцессорной обработки, а не для запуска программы в фоновом режиме.

Допустим, ради обсуждения, что вы хотели запустить program.sh и собрать то, что оно отправляет на стандартный вывод. Чтобы сделать это с тканью, создайте локально:

fabfile.py:

from fabric.api import run
def runmyprogram():
    run('./program.sh > output 2> /dev/null < /dev/null &')

Затем локально выполните:

fab -H remotebox runmyprogram

Программа будет выполняться удаленно, но фабрика не будет ждать ее завершения. Вы должны будете собрать выходные файлы позже, возможно, используя scp. «&» Выполняет этот запуск в фоновом режиме на удаленном компьютере, и перенаправление вывода необходимо для избежания зависания сеанса фабрики .

Если вам не нужно использовать ткань, есть более простые способы сделать это. Вы можете SSH индивидуально и запустить

nohup ./program.sh > output &

затем вернитесь позже, чтобы проверить вывод.

Если это то, чем вы будете заниматься на регулярной основе, то это может быть лучшим вариантом, поскольку вы можете просто настроить задание cron так, чтобы оно запускалось так часто, а затем собирать вывод в любое время.

Если вы не хотите собирать выходные файлы позже, вы можете использовать:

fabfile.py:

from fabric.api import run
def runmyprogram():
    run('./program.sh')

Затем на вашем локальном компьютере:

fab -H remotebox runmyprogram > output &

Задания будут выполняться удаленно и помещать все свои выходные данные обратно в локальный выходной файл. Это работает в фоновом режиме на вашем локальном компьютере, так что вы можете делать другие вещи. Однако, если соединение между вашей локальной и удаленной машинами может быть прервано, лучше использовать первый подход, чтобы выходные данные всегда безопасно сохранялись на удаленных машинах.

2 голосов
/ 07 июня 2011

Для тех, кто наткнулся на этот пост в будущем.Python-демон все еще может работать.Просто убедитесь, что загружаете полки в одном и том же процессе.Таким образом, ранее полочные dicts загружаются в родительский процесс, когда python-daemon порождает дочерний процесс, обработчик dict передается неправильно.Когда мы это исправим, все снова заработает.

Спасибо за те, кто предлагает ценные комментарии к этой теме!

...