Будут ли сценарии оболочки, вызываемые из python, сохраняться после завершения работы скрипта python?

StackOverflow https://stackoverflow.com/questions/2240494

  •  19-09-2019
  •  | 
  •  

Вопрос

В рамках автоматизированного тестирования у меня есть скрипт на 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,)
    )
Это было полезно?

Решение

Все потоки Python умрут вместе с Python.Кроме того, os.system блокируется.Но это нормально - если команда, которую запускает os.system(), запускает новый процесс (но не дочерний процесс), все будет хорошо.В Windows, например, если команда начинается с "start", то процесс "start"'d останется после смерти Python.

Редактировать: nohup является эквивалентом start в Linux.(Благодаря S.Лотт).

Другие советы

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

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

может быть, сделать что-то вроде shell = True

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top