Могу ли я выполнить nohup/screen уже запущенного процесса?

Я делаю несколько тестовых прогонов долгосрочных сценариев переноса данных через SSH. Допустим, я начинаю запускать сценарий около 16:00; сейчас 6 вечера катается, и я проклинаю себя за то, что не сделал все это в screen,

Есть ли способ "задним числом" nohup процесс, или я должен оставить свой компьютер в сети всю ночь? Если невозможно прикрепить screen к /nohup процесс, который я уже начал, тогда почему? Как-то связано с тем, как взаимодействует родитель / ребенок? (Я не приму ответ "нет", который по крайней мере не отвечает на вопрос "почему" - извините;))

13 ответов

Решение

Если вы используете Bash, вы можете запустить disown -h job

отрекаться

disown [-ar] [-h] [jobspec ...]

Без опций каждая спецификация заданий удаляется из таблицы активных заданий. Если -h Если задана опция, задание не удаляется из таблицы, но помечается так, что SIGHUP не отправляется заданию, если оболочка получает SIGHUP. Если задание отсутствует, и ни -a ни -r опция указана, текущее задание используется. Если задание не указано, -a опция означает удалить или пометить все вакансии; -r Опция без аргумента jobspec ограничивает работу запущенными заданиями.

Используйте reptyr

Из README:

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.)

Несколько сообщений в блоге его автора:

Чтобы украсть процесс от одного tty до вашего текущего tty, вы можете попробовать этот хак:

http://www.ucc.asn.au/~dagobah/things/grab.c

Он нуждается в некотором переформатировании, чтобы скомпилировать в текущие версии Linux/glibc, но все еще работает.

Когда процесс начинается, STDIN, STDOUT и STDERR подключаются к чему-либо. Как правило, вы не можете изменить это после запуска команды. В случае, если вы описываете, это, вероятно, tty, связанный с сессией ssh. nohup в значительной степени просто делает...

command < /dev/null > nohup.out 2>&1

То есть устанавливает STDIN в /dev/null, STDOUT в файл и STDERR в STDOUT. Экран делает гораздо более сложные вещи, включая настройку ttys, которые направлены на себя.

Я не знаю ни одного способа задним числом nohup или скрининга запущенного процесса. Если вы перейдете в /proc/$pid/fd и увидите, на что указывают 0, 1 и 2.

Вы можете испытать удачу с отречением, но не в том случае, если процесс пытается что-либо сделать с STDIN, STDOUT или STDERR.

Cryopid - это дальнейшее развитие от автора grab.c, который замораживает процесс в файл, который вы затем запускаете (внутри экрана), чтобы возобновить процесс.

Я могу только дать вам простое "Нет" без объяснения, почему для экранной части я бы сам был заинтересован в причине.

Однако вы пытались 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.

Nohup в Solaris/OpenSolaris имеет флаг -p для nohup запущенного процесса - например, см. справочную страницу nohup Solaris 10.

Недавно я увидел ссылку на neercs, похожую на экран утилиту, созданную с использованием libcaca, библиотеки цветов ascii-art. Среди других функций, он может похвастаться возможностью захватить существующий процесс и переопределить его внутри сеанса neercs (экран).

Однако я не использовал его, поэтому не могу комментировать, работает он или нет.

Если вы можете жить, не имея возможности взаимодействовать с процессом, и не возражаете против загрузки случайных модулей ядра, вы можете сделать хуже, чем смотреть на Snoop. Кроме того, есть несколько других проектов. Вот один вызов injcode, который в основном может делать то, что вы хотите.

Вы можете перенаправить вывод процесса в файл с помощью GDB

https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux

а затем отречься от него

Я, вероятно, недооцениваю это, так что не стесняйтесь поправлять меня (я уже узнал об отречении!)... Не сработали бы ctrl-Z и "bg", чтобы хотя бы запустить процесс в фоновом режиме? Или это ключевой вопрос, который вы все еще хотели бы видеть в STDOUT во время его работы?

Я хотел использовать nohup (или аналогичный), чтобы начать links браузер командной строки и присоединение к нему после загрузки файла с веб-сайта ASP.NET со сложным процессом аутентификации и множеством скрытых состояний просмотра, которые затрудняют использование, выполняют работу с curl/wget,

Я, наконец, в конечном итоге с tmux которая решила работу просто замечательно

  1. Бежать tmux
  2. Запустите ваше приложение (links в моем случае) и оставь его работающим
  3. Закройте сеанс SSH, приложение останется запущенным
  4. Подключитесь с SSH к той же машине позже и запустите tmux attach вернуть приложение на экран

Это то, что вы беспокоитесь о времени ожидания сессии? В этом случае вы можете нажать Ctrl-z и bg процесса, а затем просто положить что-нибудь, чтобы сохранить сеанс, как "ping -t localhost" или "top".

Если это то, что вы хотите выйти из системы, то, боюсь, я не смогу добавить другие комментарии.

Другие вопросы по тегам