Будут ли сценарии оболочки, вызываемые из python, сохраняться после завершения работы скрипта python?
-
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()
чтобы создать новый процесс и выполнить его в новом процессе.Взгляните на подпроцесс вот несколько хороших решений в стиле кулинарной книги для этого.
Как правило, чтобы запустить долго работающий сервер, независимый от своего родительского сервера, вам необходимо демонизировать его.В зависимости от вашей среды существуют различные оболочки, которые могут помочь в этом процессе.