2016-03-31 2 views
1

Хорошо, вот моя ситуация:Как перезапустить скрипт python, запущенный внутри экрана, используя сценарий bash?

На сервере у меня сеанс экрана (который был инициирован с использованием screen -S python-script), который запускает внутри него скрипт python.

Я вношу изменения в этот проект, нажав на git repo. Когда я хочу, чтобы изменения, отраженные в проекте, я SSH на сервер, screen -x python-script, а затем Ctrl-C, чтобы отправить прерывание клавиатуры, затем git pull origin master, а затем ./run_script.py

Я хочу сделать что-то умное и сделать мой проект в состоянии обновить и перезапустить. Другой небольшой сервер python будет жить на этом удаленном сервере и слушать запрос от моего проекта, этот сервер python будет использовать subprocess для запуска сценария bash, который будет обновлять и перезапускать мой проект.

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

Прямо сейчас, если бы я мог сформулировать сценарий bash, чтобы делать то, что я ищу, тогда я знаю, что это сработает (возможно ..).

+1

Вы можете использовать 'pkill', чтобы убить исполняемый скрипт и убить экран. С этого момента вы можете запустить скрипт через экран, 'screen -S python-script bash -c" git pull origin master; ./run_script.py ". Каждый раз, когда вы убиваете 'run_script.py', экран автоматически заканчивается. – alvits

+0

К сожалению, внутри экрана происходит некоторая серьезная настройка окружения. Поддержание сеанса экрана очень важно. Кроме того, мне нужно обязательно отправить прерывание клавиатуры, потому что используемая инфраструктура является потоковой, и она распознает прерывания клавиатуры, чтобы безопасно закрывать все. –

+1

Что мешает вам написать файл окружения, который можно получить? Отправка 'SIGINT' в процесс эквивалентна нажатию' Ctrl + C'. Что мешает вам отправлять этот сигнал в ваш процесс? Если ни одно из них не может быть выполнено, тогда вам будет лучше с вашим текущим ручным процессом. – alvits

ответ

2

1) Использовать nohup вместо экрана, перенаправить stdout в ротационный журнал, если вас интересуют выходы. Храните PID где-нибудь.

2) Установите ветку развертывания на свое репо.

3) Установите cronjob на сервер, чтобы вытащить ветвь развертывания каждые x минут.

4) Используйте githook, чтобы запускать/останавливать каждый раз, когда на вашем ветке развертывания появляется новая фиксация. Используйте сохраненный pid, чтобы убить его.


EDIT:

Если вам нужно убить с помощью Ctrl + C, просто отправить SIGINT с убийством затем wait для ФИДА, чтобы умереть.

Смежные вопросы