У мене є скрипт bash, який запускає сценарій python3 (давайте назвемо його startup.sh
), з ключовим рядком:
nohup python3 -u <script> &
Коли я ssh
вхожу безпосередньо та викликаю цей скрипт, сценарій python продовжує працювати у фоновому режимі після виходу. Однак, коли я запускаю це:
ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"
Процес закінчується, як тільки ssh
він закінчиться, і закриває сеанс.
Яка різниця між ними?
EDIT: Сценарій python працює за допомогою веб-сервісу через Bottle.
EDIT2: Я також спробував створити сценарій init, який дзвонить 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> &
), тому я впевнений, що мені більше не потрібно розщедритися.