it-swarm-ru.tech

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

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

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

262
ojrac

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

открестился

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

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

212
gharper

Используйте 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.)

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

82
Jonathan Tran

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

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

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

22
Juliano

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

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

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

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

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

17
freiheit

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

Однако вы пробовали 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.
13
serverhorror

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

13
TRS-80

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

9
alanc

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

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

5
Daniel Lawson

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

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

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

Upd: мне пришлось запустить gdb с Sudo и немного другой командой gdb в Ubuntu 18.04:

p (int)dup2(open("/tmp/test.stdout", 1), 1)

2
d9k

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

2
Chris_K

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

2
David Pashley

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

В конце концов я использовал tmux, который отлично справился с задачей:

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