как я могу отречься от запущенного процесса и связать его с новой оболочкой экрана?

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

<p>использование gnu <code>screen</code> - ваш лучший выбор.</p><p>начальный экран запускается при первом входе в систему - я запускаю <code>screen -d -r</code>, введите команду и отключите или приостановите ее с помощью <code>ctrl-z</code> и затем отключитесь от экрана, нажав <code>ctrl-a</code> затем <code>d</code>.</p><p>при повторном входе в систему снова подключитесь, запустив <code>screen -d -r</code>. вы будете в той же оболочке, что и раньше. вы можете запустить <code>jobs</code>, чтобы увидеть приостановленный процесс, если вы это сделали, и запустить <code>%1</code> (или соответствующее задание #), чтобы снова поставить его на передний план.</p>

<p>вы можете отменить "владение" программой из командной консоли с помощью встроенного в <a href="https://www.gnu.org/software/bash/manual/html\_node/job-control-builtins.html#index-disown"><code>disown</code></a> :</p><pre><code># press ctrl+z to suspend the program bg disown </code></pre><p>однако это только говорит shell, чтобы она не отправляла сигнал <code>sighup</code> программе при выходе из shell. программа сохранит любое соединение с терминалом, как правило, в виде стандартных потоков ввода, вывода и ошибок. нет возможности подключить их к другому терминалу. ( <a href="http://www.gnu.org/software/screen">экран</a> работает путем эмуляции терминала для каждого окна, поэтому программы прикрепляются к окну экрана.)</p><hr><p>можно повторно присоединить файловые дескрипторы к другому файлу, подключив программу в отладчике (т.е. используя <a href="http://en.wikipedia.org/wiki/ptrace"><code>ptrace</code></a> ) и заставив ее вызвать <code>open</code>, <code>dup</code> и <code>close</code>. есть несколько инструментов, которые делают это; это сложный процесс, и иногда они могут привести к сбою процесса. возможности включают (ссылки, собранные из ответов на <a href="https://unix.stackexchange.com/questions/4034/how-can-i-disown-a-running-process-and-associate-it-to-a-new-screen-shell">как я могу отречься от запущенного процесса и связать его с новой экранной оболочкой?</a> и <a href="https://serverfault.com/questions/24425/can-i-nohup-screen-an-already-started-process">могу ли я nohup/просмотреть уже запущенный процесс?</a> знак равно</p><ul> <li> <a href="http://www.ucc.asn.au/~dagobah/things/grab.c">захват</a> (и более амбициозный <a href="https://code.google.com/p/cryopid/">cryopid</a> )</li> <li> <a href="http://caca.zoy.org/wiki/neercs">neercs</a> </li> <li> <a href="https://github.com/jerome-pouiller/reredirect/">reredirect</a> </li> <li> <a href="https://github.com/nelhage/reptyr">reptyr</a> </li> <li> <a href="http://pasky.or.cz/~pasky/dev/retty/">retty</a> </li> </ul>

<p>для перемещения процесса между терминалами или для повторного подключения отключенного, вы можете использовать, например, <a href="http://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/">reptyr</a> .</p>

<p>мое любимое решение - использовать <code>tmux</code>, вы можете отсоединить сеанс и повторно подключить его в другом терминале.</p><p>когда вы отсоединились от предыдущего сеанса, вы можете безопасно закрыть терминал; позже использовать <code>tmux attach</code>, чтобы вернуться к сеансу, даже если вы вышли из системы.</p>

<p>также есть небольшая утилита под названием <a href="http://pasky.or.cz/~pasky/dev/retty/">retty</a> , которая позволяет вам снова подключить запущенные программы к другому терминалу.</p>

<p>я не использую это регулярно, но <a href="http://caca.zoy.org/wiki/neercs">neercs</a> утверждает, что поддерживает это. это <code>screen</code>-подобная программа с различными необычными функциями, такими как улучшенное управление панелями, но главное, что она предлагает, это возможность импортировать процесс в панель</p>

<p>если вы просто хотите приостановить его и перезапустить после этого, вы можете использовать <code>kill</code> с сигналом <code>stop</code> или <code>cont</code>.</p><p>сначала выясните процессы pid с</p><pre><code>$ ps aux затем отправьте сигналы этому pid, указанному в процессе$ kill -stop <pid> $ kill -cont  

"injcode" от thomashabets, кажется, именно то, что мне нужно: <a href="https://github.com/thomashabets/injcode">https://github.com/thomashabets/injcode программа injcode позволяет вводить произвольный код в работающий процесс, вне зависимости от того, знали ли вы заранее и работали screen или tmuxот readme:<blockquote> пример 1: переместить irssi из одного терминала в другой может быть, переместить его в экран. сначала запустите irssi в одном терминале. запустите injcode в другом терминале: $ injcode -m retty</p> <p>irssi теперь должен быть перенесен на второй терминал, включая новый управляющий терминал.</p> </blockquote>

<p>это сработало для меня:</p><ol> <li><code>bg</code> процесс</li> <li><code>jobs -l</code> найти номер процесса</li> <li><code>tmux</code> запустить менеджер окон оболочки</li> <li><code>reptyr -l processnumber</code></li> </ol><hr><p><code>reptyr</code> 's <code>-l</code> необходимо было заставить это работать:</p><p><code>-l like '-l', but also redirect the child's stdio to the slave.</code></p><p>из-за этой ошибки:</p><pre><code>$ reptyr 30622 [-] unable to open the tty in the child. unable to attach to pid 30622: permission denied и с -l$ reptyr -l 30622 opened a new pty: /dev/pts/4 </code></pre>