Могу ли я nohup /screen начать процесс?
Я выполняю несколько тестовых сценариев длительных сценариев миграции данных поверх SSH. Допустим, я начал запускать скрипт около 4 часов вечера; теперь, 6 часов, и я проклинаю себя за то, что я не делаю все это в screen
.
Есть ли способ «ретроактивно» nohup
процесс или мне нужно оставить свой компьютер онлайн всю ночь? Если невозможно подключить screen
к /nohup
процесс, который я уже начал, то почему? Что-то связано с тем, как взаимодействуют родительские /дочерние процессы? (Я не буду принимать ответ «нет», который, по крайней мере, не затрагивает вопрос «почему» - извините;))
12 ответов
Если вы используете Bash, вы можете запустить disown -h job
disown [-ar] [-h] [jobspec ...]
Без параметров каждый параметр занятости исключается из таблицы активных заданий. Если указан параметр
-h
, задание не удаляется из таблицы, но отмечен так, что SIGHUP не отправляется задание, если оболочка получает SIGHUP. Если jobspec нет, и ни параметр-a
, ни-r
не является , используется текущее задание. Если no jobspec не поставляется,-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/вещи /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.
Я могу дать вам простое «Нет» без объяснения причин для части экрана, меня бы интересовала причина, по которой ты сам.
Однако вы пробовали 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 запущенного процесса - например, см. страница Solaris 10 nohup .
Недавно я увидел ссылку на neercs , которая представляет собой экранную утилиту, созданную с использованием libcaca, цветная библиотека ascii-art. Среди других функций он может похвастаться возможностью захватить существующий процесс и переустановить его в сеансе neercs (screen).
Я не использовал его, однако, я не могу комментировать, работает он или нет.
Я, вероятно, недооцениваю это, поэтому не стесняйтесь исправлять меня (я уже узнал об отключении!) ... Не было бы ctrl-Z и «bg» работать, по крайней мере, чтобы процесс работал в фоновом режиме ? Или это ключевая проблема, по которой вы все равно хотите видеть STDOUT во время ее запуска?
Если вы можете жить, не имея возможности взаимодействовать с процессом, и вы не возражаете против загрузки случайных модулей ядра, вы можете сделать хуже, чем смотреть Snoop . Кроме того, есть еще несколько проектов. Здесь - это один код вызова, которые в основном могут делать то, что вы хотите сделать.
Я хотел использовать nohup
(или аналогичный), чтобы запустить браузер командной строки links
и подключиться к нему после загрузки файла с веб-сайта ASP.NET с помощью сложный процесс аутентификации и много скрытого состояния просмотра, из-за которого трудно использовать задание с помощью curl
/wget
.
Наконец я закончил использование tmux
, который решил работу просто отлично:
- Запустите
tmux
- Запустите приложение (
links
в моем случае) и оставьте его - Закрыть сеанс SSH, приложение будет работать
- Затем подключитесь к SSH на один и тот же компьютер и запустите
tmux attach
, чтобы вернуть приложение на экран
Разве ты беспокоишься о тайм-ауте сеанса? В этом случае вы можете Ctrl-z и bg выполнить этот процесс, а затем просто положить что-нибудь, чтобы сохранить сеанс живым, как «ping -t localhost» или «top».
Если вы хотите выйти из системы, я боюсь, что не могу добавить к другим комментариям.