Я знайшов це у списку випусків github, і я думаю, що це справді відповідає на ваше запитання.
Це насправді не проблема SSH, це більш тонка поведінка навколо неінтерактивних / інтерактивних режимів BASH та розповсюдження сигналу для процесових груп.
Далі базується на
/programming/14679178/why-does-ssh-wait-for-my-subshells-without-t-and-kill-them-with-t/14866774#14866774
та http: //www.itp.uzh.ch/~dpotter/howto/daemonize , з деякими припущеннями не повністю підтвердженими, але тести про те, як це працює, наче підтверджують.
pty / tty = хибно
Запущена оболонка bash підключається до stdout / stderr / stdin запущеного процесу і продовжує працювати, поки нічого не приєднано до розеток, і діти не вийдуть. Хороший процес Deamon забезпечить, щоб він не чекав, поки діти вийдуть, розщедрить дочірній процес і потім вийдуть. У цьому режимі SSH жоден SIGHUP не надсилатиме дочірній процес. Я вважаю, що це спрацює правильно для більшості сценаріїв, виконуючи процес, який обробляє деамонізацію і не потребує фонового зображення. Якщо сценарії init використовують "&" для фонового процесу, то, ймовірно, основною проблемою буде те, чи спрацьований фоновий процес коли-небудь намагається прочитати з stdin, оскільки це спровокує SIGHUP, якщо сеанс припинено.
pty / tty = вірно *
Якщо фоновий скрипт init процес запустився, батьківська оболонка BASH поверне код виходу на SSH-з'єднання, яке, в свою чергу, виглядає негайно, оскільки він не чекає, коли дочірній процес закінчиться і не блокується в stdout / stderr / stdin. Це призведе до того, що SIGHUP буде надісланий до батьківської групи процесів оболонки bash, яка, оскільки контроль роботи відключена в неінтерактивному режимі в bash, включатиме дочірні процеси, щойно запущені. Якщо демон-процес явно починає новий сеанс процесу під час розгортання або в роздвоєному процесі, тоді він або його діти не отримають SIGHUP від вихідного процесу BASH. Зауважте, що це відрізняється від призупинених завдань, які відображатимуться SIGTERM. Я підозрюю, що проблеми навколо цього лише працюють іноді пов'язані з умовами легкої гонки.
http://www.itp.uzh.ch/~dpotter/howto/daemonize , ви побачите, що в коді новий сеанс створюється роздвоєним процесом, який може не запускатися до виходу з батьків, таким чином, виходить випадковий поведінка успіху / невдачі, згадана вище. Запис уві сні дозволить достатньо часу для того, щоб процес роздрібнився створив новий сеанс, тому він працює в деяких випадках.
pty / tty = вірно, а керування роботою явно включено в bash
SSH не підключатиметься до stdout / stderr / stdin bash-оболонки або будь-яких запущених дочірніх процесів, що означає, що він вийде, як тільки батьківська оболонка bash почне завершувати виконання запитуваних команд. У цьому випадку, з явним увімкненим контролем за роботою, будь-які процеси, запущені оболонкою bash з позначкою '&' для їх фонового зображення, будуть негайно розміщені в окремий сеанс і не отримають сигнал SIGHUP, коли вихідний процес до сеансу BASH закінчується ( SSH-з'єднання в цьому випадку).
Що потрібно виправити
Я думаю, що рішення просто потрібно чітко вказати в документації на виконання операцій / sudo як особливий випадок при роботі з фоновими процесами / послугами. В основному або використовуйте 'pty = false', або там, де це неможливо, явно ввімкніть управління роботою як першу команду, і поведінка буде правильною.
tomcat/bin/startup.sh
пов’язано зfg
/bg
?