Перемещение уже запущенного процесса на экран

222

Моя офисная работа обычно видит, что я подключен к Linux через VNC.

Иногда я запускаю удаленную работу на консоли и позже понимаю, что она выполняется намного дольше, чем ожидалось. (Должен был начать это под Screen в первую очередь ...)

Я не хочу, чтобы моя рабочая станция работала всю ночь, просто чтобы держать сеанс VNC открытым; Я хотел бы переместить это уже запущенное удаленное задание в сеанс Screen (на удаленном блоке), чтобы я мог выключить рабочую станцию ​​(и восстановить соединение на следующее утро).

Как это можно сделать, если вообще?

DevSolar
источник
2
и это обман, serverfault.com/questions/49877/… - кажется, это невозможно сделать.
Пол Диксон
Поиск сценария скрининга.
Вашу

Ответы:

217

Посмотрите на reptyr , который делает именно это. Страница github содержит всю информацию.

reptyr - инструмент для "перепечатывания" программ.

reptyr - это утилита, которая берет существующую работающую программу и присоединяет ее к новому терминалу. Запустил длительный процесс через ssh, но должен уйти и не хочет его прерывать? Просто запустите экран, используйте reptyr, чтобы захватить его, а затем завершите сеанс ssh и идите домой.

ИСПОЛЬЗОВАНИЕ

PID рептира

«reptyr PID» захватит процесс с идентификатором PID и подключит его к вашему текущему терминалу.

После подключения процесс примет входные данные и запишет выходные данные на новый терминал, включая ^ C и ^ Z. (К сожалению, если вы справитесь с этим, вам все равно придется запускать «bg» или «fg» в старом терминале. Вероятно, это невозможно исправить разумным способом без исправления вашей оболочки.)

DaveJohnston
источник
22
Если, как и я, вы посмотрели ссылку выше и вкратце рассмотрели возможность установки программы из исходных текстов, не бойтесь: это просто apt-getотказ от систем Debian.
mlissner
3
Это прекрасно работает, как я не видел это раньше?
deed02392
3
Это круто! Я бы проголосовал 10 раз, если бы мог! Кроме того, reptyr также доступен в репозиториях RedHat. Просто 'yum install', чтобы получить его.
Марк Дж. Бобак
5
Не работает, за исключением самых тривиальных случаев:Unable to attach. (This most commonly means that 11690 has a suprocesses)
Мердад
2
По крайней мере, в качестве root, вы можете использоватьreptyr -T PID
ChristophK
45

Вы не можете сделать это легко. Я бы посоветовал сделать привычку запускать экран первым делом после открытия консоли.

Тем не менее, для вашей реальной проблемы есть еще одна вещь, которую вы можете попробовать: после запуска вашей работы из терминала, создайте фоновый режим, набрав ctrl-z, а затем bg. После этого отсоедините задание от родительской оболочки; в Bash вы бы сделали disown -h %<jobid>. После этого вы можете безопасно закрыть терминал, и работа продолжится.

граф
источник
3
Это очень хорошо сработало для моего случая. reptyr и retty не смогли захватить процесс, но все, что мне было нужно, - это закрыть терминал и оставить процесс для запуска.
STW
10
FYI: после того, как отречешься -ную процесс может быть reptyr -ed внутри экрана .
Адам
1
Это убило мою программу бега :(
Mehrdad
39

Когда вы используете Linux, как насчет использования retty во вновь запущенном процессе экрана?

$ screen -S my_process
$ retty $(pgrep my_process)
/redraw

НТН

веселит,

Роб Уэллс
источник
1
Не знал о ретти, спасибо. Тем не менее, для тех длительных работ, которые я имею в виду, я немного неохотно использую инструмент, который называет себя «очень легким испытанием». Я иду с решением Эрла.
1
не вижу ретти в Gentoo
Сергей
не может присоединиться к 4858
Арнольд Роа