поддерживайте процессы, запущенные после отключения сеанса ssh

<p>иногда у меня есть долго запущенные процессы, которые я хочу запустить перед отправкой домой, поэтому я создаю ssh-сеанс на сервере, чтобы запустить процесс, но затем я хочу закрыть свой ноутбук и пойти домой, а позже, после ужина, я хочу проверьте процесс, который я начал перед уходом с работы. как я могу сделать это с ssh? насколько я понимаю, если вы разорвете ваше ssh-соединение, вы также прервете сеанс входа в систему на сервере, что приведет к гибели длительного процесса.</p>

<p>используйте <code>nohup</code>, чтобы ваш процесс игнорировал сигнал зависания:</p><pre><code>$ nohup long-running-process & $ exit </code></pre>

<p>вы хотите использовать экран gnu. это супер круто!</p><pre><code>ssh me@myserver.com screen #start a screen session run-a-long-process </code></pre><p><kbd>ctrl</kbd>+<kbd>a</kbd> , <kbd>d</kbd> оторваться от вашего сеанса экрана</p><pre><code>exit #disconnect from the server, while run-a-long-process continues </code></pre><p>когда вы вернетесь к своему ноутбуку:</p><pre><code>ssh me@myserver.com screen -r #resume the screen session </code></pre><p>тогда проверьте прогресс вашего длительного процесса!</p><p><code>screen</code> - это очень всеобъемлющий инструмент, который может сделать намного больше, чем я описал. во время сеанса экрана попробуйте ctrl + a,? выучить несколько общих команд. вероятно, наиболее распространенными являются:</p><ul> <li><kbd>ctrl</kbd>+<kbd>a</kbd> , <kbd>c</kbd> создать новое окно</li> <li><kbd>ctrl</kbd>+<kbd>a</kbd> , <kbd>n</kbd> переключиться на следующее окно в вашем сеансе экрана</li> <li><kbd>ctrl</kbd>+<kbd>a</kbd> , <kbd>p</kbd> переключиться на предыдущее окно вашего сеанса экрана</li> <li>если вы входите в систему из разных систем, вы можете случайно остаться подключенными к активному сеансу экрана на другом компьютере. по этой причине я всегда возобновляю с <code>screen -d -r</code>, чтобы гарантировать, что если к моему экранному сеансу присоединится другая оболочка, она будет отключена, прежде чем я возобновлю ее в моей текущей системе.</li> </ul>

<p>если вы не запланировали заранее и не настроили <code>screen</code> и т.д., просто сделайте следующее:</p><ol> <li> <p>если ваш процесс работает в фоновом режиме: перейдите к # 3, иначе: <code>ctrl-z</code> приостановить процесс переднего плана. это сообщит о задании № приостановленного процесса, например:</p> <pre><code>[1]+ stopped processname </code></pre></li> <li> <p>отправьте <code>processname</code> на задний план с помощью <code>bg %1</code> (используя то, что задание # следует за <code>%</code>). это возобновит <code>processname</code> в фоновом режиме.</p> </li> <li> <p> <a href="http://www2.research.att.com/~gsf/man/man1/disown.html">disown</a> <code>processname</code> с <code>disown %1</code> или <code>disown pid</code>. использовать <code>-h</code> помечать, если вы хотите сохранить право собственности до тех пор, пока вы не прекратите работу своей текущей оболочки.</p> </li> </ol>

<p>то, что вы хотите использовать, это экран или, что еще лучше, удобная оболочка вокруг экрана, которая называется byobu.</p><p>экран позволяет запускать несколько сеансов виртуального терминала в одном сеансе ssh. a <a href="http://ubuntu-tutorials.com/2007/05/04/command-line-multitasking-with-screen/">учебник</a> и <a href="https://help.ubuntu.com/community/screen">страницы справки</a> доступны.</p><p> <a href="http://manpages.ubuntu.com/manpages/karmic/man1/byobu.1.html">byob</a> - это оболочка, которая позволяет легко открывать новые экраны с помощью простой функциональной клавиши вместо комбинации клавиш из ctrl-a. он также показывает строку состояния со всеми открытыми виртуальными терминалами, которые могут быть названы.</p><p>еще одна приятная особенность заключается в том, что весь ваш экран может работать, пока ваше ssh-соединение отключено. вы просто подключаетесь снова через ssh и вызываете byobu, и все как раньше.</p><p>наконец-то <a href="http://unixlab.blogspot.com/2009/11/enhancing-terminals-with-byobu-on.html">скриншоты</a> byobu.</p>

<p>стоит отметить, что</p><p><code>ssh -t lala screen -rxu moo</code> присоединится к сеансу <strong>moo</strong> на хосте <strong>lala</strong></p><p><code>ssh -t lala screen -s moo</code> создаст сеанс <strong>moo</strong> на хосте <strong>lala</strong></p><p>а также</p><p><code>ssh -t lala screen -s moo quux</code> создаст сеанс <strong>moo</strong> на хосте <strong>lala</strong> и запустит программу <strong>quux</strong>, завершив сеанс по завершении.</p>

<p><strong> хорошее руководство можно найти здесь: </strong> <a href="http://www.howtogeek.com/howto/ubuntu/keep-your-ssh-session-running-when-you-disconnect/">продолжайте сеанс ssh при отключении</a> </p><pre><code>sudo apt-get install screen </code></pre><p>теперь вы можете начать новый сеанс экрана, просто набрав screen в командной строке. вам будет показана некоторая информация об экране. нажмите enter, и вы получите обычный запрос.</p><p><strong> чтобы отключиться (но оставить сеанс запущенным) </strong> нажмите <kbd>ctrl</kbd> + <kbd>a</kbd> а потом <kbd>ctrl</kbd> + <kbd>d</kbd> в немедленной последовательности. вы увидите сообщение [отделено]</p><p><strong> для повторного подключения к уже запущенному сеансу </strong></p><pre><code>screen -r </code></pre><p><strong> чтобы повторно подключиться к существующему сеансу или создать новый, если такового не существует </strong></p><pre><code>screen -d -r </code></pre><p><strong> чтобы создать новое окно внутри сеанса рабочего экрана </strong> нажмите <kbd>ctrl</kbd> + <kbd>a</kbd> а потом <kbd>c</kbd> в немедленной последовательности. вы увидите новую подсказку.</p><p><strong> для переключения с одного экрана на другое </strong> нажмите <kbd>ctrl</kbd> + <kbd>a</kbd> а потом <kbd>ctrl</kbd> + <kbd>a</kbd> в немедленной последовательности.</p><p><strong> для отображения списка открытых окон </strong> нажмите <kbd>ctrl</kbd> + <kbd>a</kbd> а потом <kbd>w</kbd> сразу</p>

<p>старый вопрос, странный еще никто не советовал <a href="https://tmux.github.io/">tmux</a> , который действует как обертка для n консолей и держит их открытыми до тех пор, пока они не понадобятся. это дает больше контроля, помимо ряда функций, которые имеет tmux. управлять им легко, вы просто запускаете tmux, который переносит вас в оболочку, запускают задание looong, затем нажимаете ctrl + b, а затем d (detach) (<code>ctrl+b</code> "ok google" для tmux, а <code>d</code> - команда для закрытия без выхода из командной консоли). это на самом деле работает, если вы просто закройте, например, putty. после ужина, когда вы снова подключитесь, вы можете снова открыть tmux с помощью <code>tmux attach</code> чтобы видеть ваш экран точно так же, как вы ушли. что-то, что я люблю, это разделение панели: <code>ctrl+b</code> и затем нажмите <code>"</code>. чтобы перейти с одной панели на другую, <code>ctrl+b</code> и затем нажмите стрелку вверх/вниз.</p>

<p>я использую nx nomachine, который бесплатен для меня, потому что это только я. по сути, он запускает x-сеанс на сервере, к которому вы можете подключаться и отключаться снова и снова. x сессия продолжается, когда вы не подключены. соединения могут быть сделаны из любого места. вы можете выбирать между плавающими окнами или одним окном, содержащим весь рабочий стол (например, полный рабочий стол gnome). клиент (который вы запускаете на своем ноутбуке) может работать на linux, macos, solaris или microsoft windows. в последнем случае, если вы выбираете плавающие окна, они отображаются отдельно на панели задач windows.</p><p>я использую свой ноутбук с windows xp (который мне нужен для определенного оборудования для windows)) в качестве внешнего интерфейса для двух моих серверов linux, использующих nx nomachine. я даже могу печатать на принтере, подключенном к мой ноутбук с windows от linux.</p>

<p><strong> tmux </strong> - хороший вариант, доступный для запуска ваших длительных процессов в фоновом режиме.</p><p>я должен продолжать запускать долго работающие процессы на облачной платформе google vm экземпляр/сервер (с ос: ubuntu 16.0). где я должен запустить терминал ssh и с терминала, у меня есть чтобы терминал оставался подключенным для запуска процесса. теперь до этого все хорошо. но подождите, если соединение с моим терминалом ssh будет прервано, тогда долго работающие процессы немедленно прекратятся, и, следовательно, я должен повторно запустить их еще раз терминал ssh перезапускается или с нового терминала ssh.</p><p>я считаю, что <code>tmux</code> является хорошим решением, позволяющим избежать завершения процессов, которые мы хотим запустить, даже после закрытия терминала.</p><p><strong> терминальный мультиплексор </strong> (<code>tmux</code>) для запуска сеанса <code>tmux</code>:</p><ol> <li>запустите терминал ssh</li> <li>введите <code>tmux</code>. откроется окно в том же терминале.</li> <li>запустите команду, чтобы запустить долго выполняющиеся процессы в сеансе tmux.</li> </ol><p>теперь, даже если ssh-терминал внезапно закрывается/завершается, сеанс tmux продолжит запуск запущенных процессов, запущенных дольше, на экземпляре/сервере.</p><p>если соединение разорвано, то как его восстановить, чтобы увидеть процессы, запущенные в сеансе tmux в фоновом режиме:</p><ol> <li>переподключите или откройте новый терминал ssh. чтобы увидеть этот процесс (который работает в фоновом режиме), введите: <code>tmux attach</code> команда.</li> </ol><p>хотите прекратить сеанс tmux:</p><ol> <li>останови процесс. затем введите <code>exit</code> в tmux-терминал-окно.</li> </ol><p>(обратите внимание: если мы используем <code>tmux detach</code> команда: она выйдет из окна/терминала сеанса tmux без завершения/остановки сеансов tmux)</p><p>для более подробной информации, пожалуйста, обратитесь к следующей статье:</p><ol> <li> <a href="https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/">https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/</a> </li> <li> <a href="https://limitlessdatascience.wordpress.com/2019/08/22/tmux-to-keep-jupyter-notebook-running-in-the-background/">https://limitlessdatascience.wordpress.com/2019/08/22/tmux-to-keep-jupyter-notebook-running-in-the-background/</a> </li> </ol>