Назад | Перейти на главную страницу

Могу ли я отключить / просмотреть уже начатый процесс?

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

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

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

отречься

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

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

Использовать рептирь

Из 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 на ваш текущий, вы можете попробовать этот прием:

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. Screen выполняет гораздо более сложные задачи, включая настройку ttys, которые обращаются к самому себе.

Я не знаю, как задним числом запретить запуск или проверить запущенный процесс. Если вы перейдете в / 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.

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

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

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

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

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

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

Вы можете перенаправить вывод процесса в файл с помощью 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)

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

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

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

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

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