могу ли я nohup / экранировать уже запущенный процесс?

<p>я делаю несколько тестовых прогонов долгосрочных сценариев переноса данных через ssh. допустим, я начинаю запускать сценарий около 4 часов дня; сейчас 6 pm катается, и я проклинаю себя за то, что не сделал все это в <code>screen</code>.</p><p>есть ли какой-нибудь способ "задним числом" <code>nohup</code> процесса, или я должен оставить свой компьютер в сети всю ночь? если невозможно присоединить <code>screen</code> к/<code>nohup</code> процессу, который я уже начал, то почему? как-то связано с тем, как взаимодействует родитель/ребенок? (я не приму ответ "нет", который по крайней мере не отвечает на вопрос "почему" - извините;))</p>

<p>если вы используете bash, вы можете запустить <code>disown -h job</code></p><blockquote> <p> <a href="http://www.faqs.org/docs/bashman/bashref\_79.html">открестился</a> </p> <pre><code>disown [-ar] [-h] [jobspec ...] </code></pre> <p>без параметров каждая спецификация заданий удаляется из таблицы активных заданий. если задана опция <code>-h</code>, задание не удаляется из таблицы, а помечается, чтобы sighup не отправлялось заданию, если оболочка получает sighup. если спецификация задания отсутствует и не указана ни опция <code>-a</code>, ни <code>-r</code>, используется текущее задание. если спецификация заданий не указана, опция <code>-a</code> означает удаление или пометку всех заданий; опция <code>-r</code> без аргумента jobspec ограничивает выполнение операций заданиями.</p> </blockquote>

<p><strong> используйте <a href="https://github.com/nelhage/reptyr">reptyr</a> </strong></p><p>из readme:</p><pre><code>reptyr - a tool for "re-ptying" programs. ----------------------------------------- reptyr is a utility for taking an existing running program and attaching it to a new terminal. started a long-running process over ssh, but have to leave and don't want to interrupt it? just start a screen, use reptyr to grab it, and then kill the ssh session and head on home. usage ----- reptyr pid "reptyr pid" will grab the process with id pid and attach it to your current terminal. after attaching, the process will take input from and write output to the new terminal, including ^c and ^z. (unfortunately, if you background it, you will still have to run "bg" or "fg" in the old terminal. this is likely impossible to fix in a reasonable way without patching your shell.) </code></pre><p>несколько сообщений в блоге его автора:</p><ul> <li> <a href="http://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/">reptyr: присоединить запущенный процесс к новому терминалу</a> </li> <li> <a href="http://blog.nelhage.com/2011/02/changing-ctty/">reptyr: изменение терминала управления процессом</a> </li> </ul>

<p>чтобы украсть процесс от одного tty до вашего текущего tty, вы можете попробовать этот хак:</p><p> <a href="http://www.ucc.asn.au/~dagobah/things/grab.c">http://www.ucc.asn.au/~dagobah/things/grab.c</a> </p><p>он нуждается в некотором переформатировании, чтобы скомпилировать в текущие версии linux/glibc, но все еще работает.</p>

<p>когда процесс начинается, stdin, stdout и stderr подключаются к <em>что-то</em>. как правило, вы не можете изменить это после запуска команды. в случае, если вы описываете, это, вероятно, tty, связанный с сессией ssh. нохуп в значительной степени просто делает ...</p><pre><code>command < /dev/null > nohup.out 2>&1 </code></pre><p>то есть устанавливает stdin в/dev/null, stdout в файл и stderr в stdout. экран делает гораздо более сложные вещи, включая настройку ttys, которые направлены на себя.</p><p>я не знаю ни одного способа задним числом nohup или скрининга запущенного процесса. если вы перейдете в/proc/$ pid/fd и увидите, на что указывают 0, 1 и 2.вы можете испытать удачу с отречением, но не в том случае, если процесс попытается что-либо сделать с помощью stdin, stdout или stderr.

я могу только дать вам простое "нет" без объяснения, почему для экранной части я бы сам был заинтересован в причине.однако вы пробовали disown (встроенный bash)~ $ echo $shell /bin/bash ~ $ type disown disown is a shell builtin ~ $ help disown disown: disown [-h] [-ar] [jobspec ...] by default, removes each jobspec argument from the table of active jobs. if the -h option is given, the job is not removed from the table, but is marked so that sighup is not sent to the job if the shell receives a sighup. the -a option, when jobspec is not supplied, means to remove all jobs from the job table; the -r option means to remove only running jobs. </code></pre>

<p> <a href="http://cryopid.berlios.de/">cryopid</a> - это дальнейшая разработка автора grab.c, которая фиксирует процесс в файле, который затем запускается (внутри экрана) для возобновления процесса.</p>

<p>nohup в solaris/opensolaris имеет флаг -p для запуска работающего процесса nohup - например, см. <a href="http://download.oracle.com/docs/cd/e19253-01/816-5165/6mbb0m9mn/index.html">справочная страница solaris 10 nohup</a> .</p>

<p>недавно я увидел ссылку на <a href="http://caca.zoy.org/wiki/neercs">neercs</a> , которая похожа на экран утилиту, созданную с использованием libcaca, библиотеки цветов ascii-art. среди других функций, он может похвастаться возможностью захватить существующий процесс и переопределить его внутри сеанса neercs (экран).</p><p>однако я не использовал его, поэтому не могу комментировать, работает он или нет.</p>

<p>вы можете перенаправить вывод процесса в файл с помощью gdb</p><p> <a href="https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux">https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux</a> </p><p>а затем отречься от него</p><p>upd: мне пришлось запустить gdb с sudo и немного другой командой gdb в ubuntu 18.04:</p><p><code>p (int)dup2(open("/tmp/test.stdout", 1), 1)</code></p>

<p>я, вероятно, недооцениваю это, так что не стесняйтесь поправлять меня (я уже узнал об отречении!) ... не сработали бы ctrl-z и "bg", чтобы хотя бы запустить процесс в фоновом режиме? или это ключевой вопрос, который вы все еще хотели бы видеть stdout, пока он работает?</p>

<p>если вы можете жить, не имея возможности взаимодействовать с процессом, и не возражаете против загрузки случайных модулей ядра, вы можете сделать хуже, чем смотреть на <a href="http://snoop.sourceforge.net">snoop</a> . кроме того, есть несколько других проектов. <a href="http://blog.habets.pp.se/2009/03/moving-a-process-to-another-terminal">здесь</a> это один код вызова inj, который в основном может делать то, что вы хотите.</p>

<p>я хотел использовать <code>nohup</code> (или аналогичный), чтобы запустить браузер командной строки <code>links</code> и присоединить к нему после загрузки файла с веб-сайта asp.net со сложным процессом аутентификации и большим количеством скрытое состояние просмотра, затрудняющее использование, выполняйте работу с <code>curl</code>/<code>wget</code>.</p><p>в конце концов я использовал <code>tmux</code>, который отлично справился с задачей:</p><ol> <li>выполнить <code>tmux</code></li> <li>запустите ваше приложение (<code>links</code> в моем случае) и оставьте его запущенным</li> <li>закройте сеанс ssh, приложение останется запущенным</li> <li>подключитесь с помощью ssh к той же машине позже и запустите <code>tmux attach</code> чтобы вернуть приложение на экран</li> </ol>