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


21

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

Тож я відкрив свою звичайну емуляторну програму терміналу та виконав екран. Тоді я використав цей екземпляр screenдля виконання ./script_x.sh. Тепер, з будь-якої причини, я хочу кинути використання, screenоднак script_x.shще не виконала своє завдання, і я не бажаю втрачати свій прогрес.

Чи можу я тримати активний процес живим, щоб продовжувати роботу над ним у своєму звичайному емуляторі терміналу?


14
Ви дійсно хочете вбити екран або хочете відірватися від нього? Екран призначений для запуску процесу у фоновому режимі, так що ви можете продовжувати свій звичайний сеанс, він також дозволяє програмам продовжувати працювати після виходу (наприклад, відключіть сеанс SSH). Ви завжди можете відірватися від екрана, продовжувати звичайний сеанс і підбирати місце, де ви залишилися на екрані. Ваш термінальний емулятор не має нічого спільного з цим.
BlueCacti

Або просто створіть інший екран всередині screenсеансу.
chrylis -на страйк-

11
Це питання пахне проблемою XY .
Цифровий Кріс

7
@ tjt263 - ви кажете, що пошкодуєте в першу чергу за допомогою екрана, і що б ви зробили, щоб ваш процес працював, якби ви не використовували екран? Ви все одно можете робити те ж саме з процесом на екрані, але додаток екрану має додаткову перевагу в тому, що ви можете відірватися від нього і дозволити безперешкодно працювати вашому процесу.
Джонні

@DigitalChris Це може зробити зараз. Я відчуваю, що оригінальна назва була, ймовірно, більш актуальною. Є три чіткі моменти: я запускав програму всередині screen. Я хотів припинити використання screen. Я не хотів зупиняти програму, яка працює всередині screen. Це воно. Я не знаю, як прояснити ситуацію чи висловити її простіше, ніж цю.
голоси

Відповіді:


31

TLDR: Практична відповідь: Ні.

Більш довга відповідь:

Теоретично можна. Якщо ви запустили щось на зразок nohup myprog &всередині екрана, воно продовжиться. Він ігнорує сигнал зависання і не матиме жодного вводу, але в теорії ви можете продовжувати працювати з ним.

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

Якщо ви готові це зробити, у мене вдома є закладка, яка вказує на [SU], де хтось робив саме це . Збережено для дивовижності, а не тому, що це легко і тривіально зробити.


Зауважте, що питання було відредаговано масово з моменту вашої відповіді.
chrylis -на страйк-

Відключення процесу досить просто - це питання встановлення груп процесів (з disownабо на нижчому рівні), щоб ніхто SIGHUPне надсилався, коли батьківський процес загине. Повторне підключення вводу-виводу - це зовсім інша річ - саме тут налагоджується налагоджувач
alexis

Вам не потрібно , nohupякщо ви перебуваєте в оболонці управління завданнями (як bash, ksh, csh, zsh, ashі т.д.). Якщо ви все ще використовуєте оболонку управління без роботи, як, наприклад, Борн, 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 Зовсім не зрозуміло, що ОП розуміє, як працює екран, і це найімовірніший бажаний ефект.
chrylis -на страйк-

2
Чи знаєте ви, що екран - це не термінал, відмінний від xterm, а шар (псевдотермінал), який можна приєднати до вашого реального терміналу (vterm, xterm, термінатор, (m) rxvt, будь-який) після від'єднання його від будь-якого іншого терміналу? А екран - це те, що підтримує ваш процес, який ви запустили всередині екрана (і це робить добре). Якщо ви вбиваєте (дійсно вбиваєте) екран, то виймаєте килимок з-під свого процесу ... Я просто не бачу жодної вагомої причини, чому б ви зробили це.
Гомбай Сандор

1
@ GombaiSándor: Однією з причин хотіти цього було б зробити так, щоб процес спілкувався безпосередньо з терміналом, щоб пройти через можливості, про які не знає екран. Наприклад, я одного разу зламав власну версію xterm, щоб усі дивні функціональні клавіші на моїй клавіатурі надсилали евакуаційні послідовності, що включали клавішу X11 та повний стан модифікатора, замість того, щоб намагатися зробити вигляд, що це VT102 - і потім почав встановлювати сполучення клавіш для них у emacs. Ці послідовності не проходитимуть крізь екран неушкодженим.
Геннінг Макгольм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.