У меня есть скрипт bash, который запускает скрипт python3 (давайте назовем его startup.sh
) с ключевой строкой:
nohup python3 -u <script> &
Когда я ssh
вызываю этот скрипт напрямую, скрипт python продолжает работать в фоновом режиме после выхода. Тем не менее, когда я запускаю это:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
Процесс заканчивается, как только ssh
он завершится, и закрывает сеанс.
Какая разница между двумя?
РЕДАКТИРОВАТЬ: скрипт Python запускает веб-сервис через бутылку.
РЕДАКТИРОВАТЬ 2: Я также попытался создать сценарий инициализации, который вызывает startup.sh
и работает ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"
, но получил то же самое поведение.
EDIT3: Может быть, это что-то еще в сценарии. Вот основная часть скрипта:
chmod 700 ${key_loc}
echo "INFO: Syncing files."
rsync -azP -e "ssh -i ${key_loc} -o StrictHostKeyChecking=no" ${source_client_loc} ${remote_user}@${remote_hostname}:${destination_client_loc}
echo "INFO: Running startup script."
ssh -i ${key_loc} -o StrictHostKeyChecking=no ${remote_user}@${remote_hostname} "cd ${destination_client_loc}; chmod u+x ${ctl_script}; ./${ctl_script} restart"
EDIT4: когда я запускаю последнюю строку со сном в конце:
ssh -i ${key_loc} -o StrictHostKeyChecking=no ${remote_user}@${remote_hostname} "cd ${destination_client_loc}; chmod u+x ${ctl_script}; ./${ctl_script} restart; sleep 1"
echo "Finished"
Он никогда не достигает echo "Finished"
, и я вижу сообщение сервера Bottle, которого я никогда раньше не видел:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
Я вижу «Закончено», если я вручную запускаю SSH и убиваю процесс сам.
EDIT5: Используя EDIT4, если я делаю запрос к любой конечной точке, я получаю страницу назад, но бутылка выдает ошибку:
Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.
----------------------------------------
Exception happened during processing of request from ('<IP>', 55104)
strace
если вы используете Linux или truss
Solaris и посмотрите, как и почему он завершается. Как например ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> strace -fo /tmp/debug ./startup.sh
.
&
в конце сценария запуска? Добавление &
оператора удаляет зависимость вашего ssh-сеанса от родительского идентификатора (когда родительские идентификаторы умирают, это делают и их дети). Также я думаю, что это дублирующий вопрос, основанный на этом предыдущем посте. Пост, который я представил вам в предыдущем предложении, является дубликатом этого поста, который может дать более подробные сведения.
nohup ./startup.sh &
раньше, но у него было такое же поведение. startup.sh
уже содержит форк ( nohup python3 -u <script> &
), так что я уверен, что мне не нужно снова форкать.