Я делаю несколько тестовых прогонов долгосрочных сценариев переноса данных через SSH. Допустим, я начинаю запускать сценарий около 4 часов дня; сейчас 6 PM катается, и я проклинаю себя за то, что не сделал все это в screen
.
Есть ли какой-нибудь способ "задним числом" Nohup
процесса, или я должен оставить свой компьютер в сети всю ночь? Если невозможно присоединить screen
к/Nohup
процессу, который я уже начал, то почему? Как-то связано с тем, как взаимодействует родитель/ребенок? (Я не приму ответ "нет", который по крайней мере не отвечает на вопрос "почему" - извините;))
Если вы используете 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. Нохуп в значительной степени просто делает ...
command < /dev/null > Nohup.out 2>&1
То есть устанавливает STDIN в/dev/null, STDOUT в файл и STDERR в STDOUT. Экран делает гораздо более сложные вещи, включая настройку ttys, которые направлены на себя.
Я не знаю ни одного способа задним числом 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.
Cryopid - это дальнейшая разработка автора grab.c, которая фиксирует процесс в файле, который затем запускается (внутри экрана) для возобновления процесса.
Nohup в Solaris/OpenSolaris имеет флаг -p для запуска работающего процесса Nohup - например, см. справочная страница Solaris 10 Nohup .
Недавно я увидел ссылку на neercs , которая похожа на экран утилиту, созданную с использованием libcaca, библиотеки цветов ascii-art. Среди других функций, он может похвастаться возможностью захватить существующий процесс и переопределить его внутри сеанса neercs (экран).
Однако я не использовал его, поэтому не могу комментировать, работает он или нет.
Вы можете перенаправить вывод процесса в файл с помощью 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)
Я, вероятно, недооцениваю это, так что не стесняйтесь поправлять меня (я уже узнал об отречении!) ... Не сработали бы Ctrl-Z и "bg", чтобы хотя бы запустить процесс в фоновом режиме? Или это ключевой вопрос, который вы все еще хотели бы видеть STDOUT, пока он работает?
Если вы можете жить, не имея возможности взаимодействовать с процессом, и не возражаете против загрузки случайных модулей ядра, вы можете сделать хуже, чем смотреть на Snoop . Кроме того, есть несколько других проектов. Здесь это один код вызова inj, который в основном может делать то, что вы хотите.
Я хотел использовать Nohup
(или аналогичный), чтобы запустить браузер командной строки links
и присоединить к нему после загрузки файла с веб-сайта ASP.NET со сложным процессом аутентификации и большим количеством скрытое состояние просмотра, затрудняющее использование, выполняйте работу с curl
/wget
.
В конце концов я использовал tmux
, который отлично справился с задачей:
tmux
links
в моем случае) и оставьте его запущеннымtmux attach
чтобы вернуть приложение на экран