Сохранятся ли сценарии оболочки, вызванные из python, после завершения сценария python? - PullRequest
4 голосов
/ 11 февраля 2010

В рамках автоматизированного теста у меня есть скрипт на python, который должен вызывать два скрипта оболочки, которые запускают два разных сервера, которые должны взаимодействовать после завершения вызывающего скрипта. (Это на самом деле сценарий jython, но я не уверен, что это имеет значение в данный момент.) Что я могу сделать, чтобы серверы оставались в рабочем состоянии после завершения сценария python?

На данный момент их называют примерно так:

def runcmd(str, sleep):
    debug('Inside runcmd, executing: ' + str)
    os.chdir("/new/dir/")
    directory = os.getcwd()
    print 'current dir: '+ directory
    os.system(str)

t = threading.Thread(
        target=runcmd,
        args=( cmd, 50,)
    )

Ответы [ 5 ]

2 голосов
/ 11 февраля 2010

Все потоки Python умрут с Python. Также os.system блокирует. Но это нормально - если команда, запускаемая os.system (), запускает новый процесс (но не дочерний процесс), все будет хорошо. Например, в Windows, если команда начинается с «start», процесс «start» останется после смерти Python.

EDIT: nohup эквивалентно start в Linux. (Спасибо С. Лотту).

1 голос
/ 11 февраля 2010

os.system() не возвращается, пока не завершится процесс, который он запускает. Используйте subprocess или Runtime.exec(), если вы хотите использовать его в отдельном процессе.

0 голосов
/ 11 февраля 2010

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

0 голосов
/ 11 февраля 2010

Потоки не будут работать, потому что они являются частью процесса. Вызов system не будет работать, потому что он блокируется при выполнении вашего нового процесса.

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

0 голосов
/ 11 февраля 2010

Интересно, будет ли лучше использовать подпроцесс? Openen для вас.

возможно делает что-то вроде shell = True

...