Переместить программу, запущенную на экране GNU, на другой терминал

21

Я хочу завершить экземпляр GNU screen, сохраняя процесс, выполняющийся внутри него.

Поэтому я открыл свою обычную программу-эмулятор терминала и запустил экран. Затем я использовал этот экземпляр screenдля выполнения ./script_x.sh. Теперь, по какой-то причине, я хочу прекратить использование, screenоднако script_x.shеще не выполнил свою задачу, и я не желаю лишаться своего прогресса.

Могу ли я сохранить активный процесс живым, чтобы продолжить работу над ним в моем обычном эмуляторе терминала?

голоса
источник
14
Вы действительно хотите убить экран или хотите от него отсоединиться? Экран предназначен для запуска процесса в фоновом режиме, чтобы вы могли продолжить обычный сеанс, а также позволяет приложениям продолжать работу после выхода из системы (например, отключить сеанс SSH). Вы всегда можете отсоединиться от экрана, продолжить обычную сессию и продолжить с того места, где вы оставили сеанс экрана. Ваш эмулятор терминала не имеет к этому никакого отношения.
BlueCacti
Или просто создайте другой экран внутри screenсеанса.
Хрилис - на забастовку -
11
Этот вопрос пахнет как проблема XY .
Digital Chris
7
@ tjt263 - вы говорите, что в первую очередь сожалеете об использовании screen, так что бы вы сделали, чтобы сохранить ваш процесс запущенным, если бы вы не использовали screen? Вы все еще можете сделать то же самое с процессом на экране, но у экрана есть дополнительное преимущество в том, что вы можете отсоединиться от него и позволить вашему процессу работать без помех.
Джонни
@DigitalChris Это может сделать сейчас. Я чувствую, что оригинальное название было более вероятно более актуальным. Есть 3 отличных момента: я запускал программу внутри screen. Я хотел прекратить использовать screen. Я не хотел останавливать программу, которая работала внутри screen. Вот и все. Я не знаю, как прояснить ситуацию или выразить это проще, чем это.
голоса

Ответы:

31

TLDR: Практический ответ: Нет.

Более длинный ответ:

В теории вы можете. Если вы запустили что-то вроде nohup myprog &изнутри экрана, оно продолжится. Он будет игнорировать сигнал зависания и не будет иметь никакого входа, но в теории вы могли бы продолжить работу с ним.

На практике это не так. Таким образом, если вы не хотите присоединить отладчик к запущенному процессу, переписать его файловые дескрипторы и убедиться, что процесс обрабатывает сигналы -1, когда вы закрываете экран ... тогда ответ - нет.

Если вы готовы сделать это, у меня дома есть закладка, указывающая на [SU], где кто-то сделал именно это . Сохранено для удивительности, а не потому, что это легко и тривиально сделать.

Hennes
источник
Обратите внимание, что вопрос был отредактирован с момента вашего ответа.
Хрилис - на забастовке -
Отключить процесс довольно просто - это вопрос настройки групп процессов (с disownили на более низком уровне), чтобы не SIGHUPбыло отправлено ни одного , когда родительский процесс умирает. Переподключение ввода / вывода - это совсем другое - вот где приходит отладчик.
alexis
Вам не нужно , nohupесли вы находитесь в оболочке управления заданиями (как bash, ksh, csh, zsh, ashи т.д.). Если вы все еще используете неуправляемую оболочку управления, такую ​​как Bourne, shвозможно, пришло время обновиться.
птенцы
23

Вы можете попробовать использовать reptyrдля повторного подключения уже запущенного приложения к другому терминалу. У него есть некоторые проблемы с отправкой процесса в фоновом режиме.

Я только что проверил это (начните htopвнутри screen, reptyrэто к другому терминалу, убейте screen), и это, казалось, работало хорошо. Тем не менее, это действительно хакерское решение, так что никаких гарантий.

земля
источник
1
Менее хакерский, чем использование GDB :)
Hennes
14

Да (если «убийство» на самом деле не убийство), это именно то, для чего предназначен экран. Вы должны проверить руководство и попробовать, какой из них соответствует вашим потребностям:

C-a d
C-a C-d     (detach)      Detach screen from this terminal.

C-a D D     (pow_detach)  Detach and logout.

Тогда вам понадобятся параметры командной строки -D / -d -R / -r экрана, в зависимости от вашего выбора.

Гомбай Шандор
источник
1
Это не отвечает на вопрос. ОП не хочет отсоединяться от экрана, они хотят прервать процесс на экране.
Гунтрам Блом поддерживает Монику
6
Да, он написал это, но я не уверен, что он спросил, что он хотел.
Гомбай Шандор
11
@GuntramBlohm Не совсем понятно, что ОП понимает, как работает экран, и это наиболее вероятный желаемый эффект.
Хрилис - на забастовку -
2
Знаете ли вы, что screen - это не терминал, отличный от xterm, а слой (псевдотерминал), который можно подключить к вашему реальному терминалу (vterm, xterm, terminator, (m) rxvt, любой) после отсоединения его от любого другого терминала? И экран - это то, что поддерживает ваш процесс так, как вы запустили его внутри экрана (и он делает это хорошо). Если вы убиваете (действительно убиваете) экран, то вы вытаскиваете коврик из-под вашего процесса ... Я просто не вижу веской причины, по которой вы сделали бы это.
Гомбай Шандор
1
@ GombaiSándor: Одна из причин, по которой вы захотите это сделать, - это заставить процесс общаться напрямую с терминалом, чтобы передать возможности, о которых экран не знает. Например, однажды я взломал свою собственную версию xterm, чтобы заставить все странные функциональные клавиши на моей клавиатуре отправлять escape-последовательности, которые включали в себя X11 keysym и состояние полного модификатора, вместо того, чтобы пытаться притвориться, что это VT102 - и затем начал устанавливать сочетания клавиш для них в Emacs. Эти последовательности не будут проходить через экран без повреждений.
Хеннинг Махолм