Вопрос: Могу ли я nohup / screen начать процесс?


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

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


242
2018-06-11 22:53


Источник


Просто увидел интересный пост в блоге о disown, blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the - ojrac


Ответы:


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

отрекаться

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

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


196
2018-06-11 23:03



Потрясающие; Я надеялся, что что-то подобное появится. - ojrac
Жизнь может быть несправедливой. gharper и я отправляли это примерно в то же время :) - serverhorror
Ты мой герой - Thomas Dignan
disout не относится к bash. Это также в zsh, ksh93, ... - Phil P
Я обнаружил, что вам действительно нужно использовать disown %1 если 1 является спецификацией jobs, в отличие от fg или bg, где вы просто используете bg 1  serverwatch.com/tutorials/article.php/3935306/... - mltsy


использование 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.)

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


77
2018-05-22 21:27



Я буду придерживаться встроенных инструментов (т. Е. Отключить), но это не так гибко, как reptyr. +1 - ojrac


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

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

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


22
2018-06-12 05:38



Исключительно круто. - ojrac


Когда процесс начинается, 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.


16
2018-06-11 23:04



+1 за хорошие комментарии. st (din | out | err) - другая половина проблемы, и я ценю совет о том, с чего начать искать, в следующий раз, когда я буду в этом варенье. - ojrac
Фактически вы можете изменить его на большинстве Unix. Это отвратительный взлом. Я люблю это. :) Что вы делаете, подключитесь к процессу с помощью поддержки отладки, такой как ptrace, а затем заставьте процесс вызвать dup2 (), чтобы повторно подключить 0,1,2 к другому дескриптору файла. - Zan Lynx
да, вы можете изменить его. Привлекает приостановку процесса (SIGSTOP) и изменение файловых дескрипторов для fd 0, 1, 2. Затем перезапуск (SIGCONT). - Michael Martinez


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


12
2018-06-14 18:26



Ницца! Я попытался использовать криопид в моей магистерской диссертации о миграции процессов, но он не работал все время, независимо от того, что я сделал. В конце концов, мне пришлось использовать dynckpt с древней версией Linux. Возможно, вы участвуете в разработке криоида? Я вижу, что ваше имя похоже на домен автора. - Juliano
Я не участвую в разработке, я просто знаю автора из университета. На данный момент у него нет времени поддерживать криопид, поэтому похоже, что некоторые люди начали работать над ним на sharesource.org/project/cryopid - TRS-80


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

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

11
2018-06-11 23:02





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


9
2018-06-13 00:59