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

2864
tjt263

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

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

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

21
Вы действительно хотите убить экран или хотите от него отсоединиться? Экран предназначен для запуска процесса в фоновом режиме, чтобы вы могли продолжить обычный сеанс, а также позволяет приложениям продолжать работу после выхода из системы (например, отключить сеанс SSH). Вы всегда можете отсоединиться от экрана, продолжить сеанс в обычном режиме и продолжить с того места, где вы оставили сеанс экрана. Ваш эмулятор терминала не имеет к этому никакого отношения. BlueCacti 8 лет назад 14
Или просто создайте другой экран внутри сеанса `screen`. chrylis 8 лет назад 0
Этот вопрос пахнет как [Проблема XY] (http://xyproblem.info/). Digital Chris 8 лет назад 11
@ tjt263 - вы говорите, что в первую очередь сожалеете об использовании screen, так что бы вы сделали, чтобы сохранить ваш процесс запущенным, если бы вы не использовали screen? Вы можете сделать то же самое с процессом на экране, но у экрана есть дополнительное преимущество в том, что вы можете отсоединиться от него и позволить вашему процессу работать без помех. Johnny 8 лет назад 7
@DigitalChris Это может сделать сейчас. Я чувствую, что оригинальное название было более вероятно более актуальным. Есть 3 отличительных момента: я запускал программу внутри `screen`. Я хотел прекратить использовать `screen`. Я не хотел останавливать программу, которая работала внутри `screen`. Вот и все. Я не знаю, как прояснить ситуацию или выразить это проще, чем это. tjt263 8 лет назад 0
@ tjt263 В ответе Гомбая говорилось, что: (а также все основные способы использования экранного поиска) вы набираете `ctrl-A`, затем` D`. Вы отсоединитесь от сеанса, который все еще будет запущен. Если вы введете `screen -list`, вы увидите это. Digital Chris 8 лет назад 0
@DigitalChris Хорошо, конечно. Итак .. На данный момент; как мне возобновить взаимодействие с моей программой; без использования `экрана`? tjt263 8 лет назад 0
Почему вы говорите "без использования экрана"? Способ возобновления взаимодействия с экраном. Какое ограничение удерживает вас от повторного подключения к экрану? Digital Chris 8 лет назад 0
@Digital Крис - я продолжаю говорить, "не используя` screen` ", потому что это единственная точка вопроса. Я запускал `screen` случайно. *** Я хочу, чтобы этот дополнительный слой между моим терминалом и программой исчез. *** Моя причина «Почему?» Не имеет значения. Я хочу это сделать. tjt263 8 лет назад 0

3 ответа на вопрос

31
Hennes

TLDR: Practical answer: No.

Longer answer:

In theory you can. If you started something like nohup myprog & from inside the screen then it will continue running. It will ignore a hangup signal and will not have any input, but in theorie you could continue working with it.

In practise this is not the case. Thus unless you want to attach a debugger to the running process and rewrite its file handles and make sure that the process handles -1 signals when you close screen ... then the answer is no.

If you are ready to do this, I have a bookmark at home pointing to [SU] where someone did just that. Saved for awesomeness, not because it is easy and trivial to do.

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

You can try using reptyr to reattach already running application to different terminal. It has some issues with sending process to background, though.

I just tested it (start htop inside screen, reptyr it to another terminal, kill screen), and it seemed to work alright. Still it's a really hacky solution, so no guarantees.

Менее хакерский, чем использование GDB :) Hennes 8 лет назад 1
14
Gombai Sándor

Yes (if "killing" is not really killing), that's actually exactly what screen is for. You should check the manual and try which one of these fits your needs:

C-a d C-a C-d (detach) Detach screen from this terminal. C-a D D (pow_detach) Detach and logout. 

Then what you will need is the -D/-d -R/-r command line options of screen, depending on your choice.

Это не отвечает на вопрос. ОП не хочет отсоединяться от экрана, они хотят прервать процесс на экране. Guntram Blohm 8 лет назад 1
Да, он написал это, но я не уверен, что он спросил, что он хотел. Gombai Sándor 8 лет назад 6
@GuntramBlohm Не совсем понятно, что ОП понимает, как работает экран, и это наиболее вероятный желаемый эффект. chrylis 8 лет назад 11
Комментарий @GuntramBlohm ОП к вопросу (опубликованный через 10 часов после вашего комментария) указывает на то, что именно этого хочет ОП Izkata 8 лет назад 0
Я не намерен повторно присоединять, используя `screen`, хотя. Я хотел бы продолжить активный процесс, но с моим обычным `xterm` вместо` screen`. Этот ответ все еще подходит? tjt263 8 лет назад 0
Знаете ли вы, что экран - это не терминал, отличный от xterm, а слой (псевдотерминал), который можно подключить к реальному терминалу (vterm, xterm, терминатор, (m) rxvt, любой) после отсоединения его от любого другого терминала? И экран - это то, что поддерживает ваш процесс так, как вы запустили его внутри экрана (и он делает это хорошо). Если вы убиваете (действительно убиваете) экран, то вы вытаскиваете коврик из-под вашего процесса ... Я просто не вижу веской причины, по которой вы сделали бы это. Gombai Sándor 8 лет назад 2
@ GombaiSándor: Одна из причин, по которой _want_ хочет это сделать, - заставить процесс напрямую общаться с терминалом, чтобы передать возможности, о которых экран не знает. Например, однажды я взломал свою собственную версию xterm, чтобы заставить все странные функциональные клавиши на моей клавиатуре отправлять escape-последовательности, которые включали XIM-клавиатуру и состояние полного модификатора, вместо того, чтобы пытаться притвориться, что это VT102 - и затем начал устанавливать сочетания клавиш для них в Emacs. Эти последовательности не будут проходить через экран без повреждений. Henning Makholm 8 лет назад 1
(Но, конечно, это не является _существенно_ проблемой, которая может быть решена простым принудительным повторным подключением процесса непосредственно к другому pty, потому что модель Unix не дает никакого способа изменить переменную $ TERM процесса на что-то другое, пока он выполняется и спровоцируйте его прочитать на лету совершенно новое определение терминала - то есть _why_ экран должен переводить все в свои виртуальные последовательности управления и обратно). Henning Makholm 8 лет назад 0
@ GombaiSándor * ДА! Я ЗНАЮ, ЧТО! * *** Я пытаюсь удалить этот слой! *** * Я хочу вытащить коврик из-под моего процесса и посадить его на ноги! * tjt263 8 лет назад 0

Похожие вопросы