Przenieś program uruchomiony na ekranie GNU na inny terminal

21

Chcę zakończyć instancję GNU, screenjednocześnie zachowując przebiegający w niej proces.

Otworzyłem więc mój zwykły program emulujący terminal i wykonałem ekran. Następnie użyłem tego wystąpienia screendo wykonania ./script_x.sh. Teraz, z jakiegokolwiek powodu, chcę rzucić używanie, screenjednak script_x.shjeszcze nie wykonałem tego zadania i nie chcę stracić mojego postępu.

Czy mogę utrzymać aktywny proces, aby kontynuować pracę w moim emulatorze terminali?

głosy
źródło
14
Czy naprawdę chcesz zabić ekran, czy chcesz się od niego oderwać? Screen służy do uruchamiania procesu w tle, dzięki czemu możesz kontynuować normalną sesję, a także pozwala aplikacjom kontynuować działanie po wylogowaniu (np. Rozłącz sesję SSH). Zawsze możesz odłączyć się od ekranu, kontynuować w normalnej sesji i odebrać w miejscu, w którym zostałeś w sesji ekranowej. Twój emulator terminala nie ma z tym nic wspólnego.
BlueCacti,
Lub po prostu utwórz kolejny ekran w screensesji.
Chrylis
11
To pytanie pachnie jak problem XY .
Cyfrowy Chris
7
@ tjt263 - mówisz, że żałujesz, że używasz screena, więc co byś zrobił, aby proces nadal działał, gdybyś nie używał screena? Nadal możesz zrobić to samo z procesem na ekranie, ale screen ma tę dodatkową zaletę, że możesz się od niego odłączyć i pozwolić, aby proces przebiegał bez zakłóceń.
Johnny
@DigitalChris To może zrobić teraz. Wydaje mi się, że oryginalny tytuł był prawdopodobnie bardziej odpowiedni. Istnieją 3 różne punkty: uruchomiłem program w środku screen. Chciałem przestać używać screen. Nie chciałem zatrzymywać uruchomionego programu screen. to jest to! Nie wiem, jak wyjaśnić sytuację lub wyrazić ją w prostszy sposób.
głosy

Odpowiedzi:

31

TLDR: Praktyczna odpowiedź: nie.

Dłuższa odpowiedź:

Teoretycznie możesz. Jeśli uruchomiłeś coś nohup myprog &z poziomu ekranu, będzie on kontynuował działanie. Zignoruje sygnał zawieszenia i nie będzie miał żadnych danych wejściowych, ale w teorii możesz kontynuować pracę z nim.

W praktyce tak nie jest. Zatem jeśli nie chcesz dołączyć debugera do uruchomionego procesu i przepisać jego uchwyty plików i upewnić się, że proces obsługuje sygnały -1 po zamknięciu ekranu ... odpowiedź brzmi: nie.

Jeśli jesteś gotów to zrobić, mam zakładkę w domu, wskazując [SU], gdzie ktoś właśnie to zrobił . Uratowany z powodu niesamowitości, nie dlatego, że jest to łatwe i trywialne.

Hennes
źródło
Zwróć uwagę, że pytanie zostało masowo edytowane od twojej odpowiedzi.
Chrylis
Odłączanie procesu jest dość proste - chodzi o ustawienie grup procesów (z disownlub na niższym poziomie), aby nie SIGHUPbyły wysyłane, gdy proces nadrzędny umiera. Ponowne podłączanie we / wy to zupełnie inna sprawa - właśnie tam pojawia się debugger.
Alexis
Nie musisz nohup, jeśli jesteś w powłoce sterowania robota (jak bash, ksh, csh, zsh, ash, itd.). Jeśli nadal używasz powłoki kontrolnej innej niż zadanie, takiej jak Bourne, shbyć może nadszedł czas na aktualizację.
pisklęta
23

Możesz spróbować reptyrponownie podłączyć już działającą aplikację do innego terminala. Ma jednak pewne problemy z wysyłaniem procesu do tła.

Właśnie go przetestowałem (zacznij w htopśrodku screen, reptyrprzejdź do innego terminalu, zabij screen) i wydawało się, że działa dobrze. Nadal jest to naprawdę hacking rozwiązanie, więc nie ma gwarancji.

Ziemia
źródło
1
Mniej hacky niż przy użyciu gdb :)
Hennes
14

Tak (jeśli „zabijanie” nie jest tak naprawdę zabijaniem), to właśnie do tego służy ekran. Powinieneś sprawdzić instrukcję i wypróbować, który z nich pasuje do twoich potrzeb:

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

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

Następnie potrzebujesz opcji wiersza poleceń -D / -d -R / -r ekranu, w zależności od twojego wyboru.

Gombai Sándor
źródło
1
To nie odpowiada na pytanie. OP nie chce odłączyć się od ekranu, chce zakończyć proces ekranu.
Guntram Blohm wspiera Monikę
6
Tak, napisał to, ale nie jestem pewien, czy zapytał, czego chce.
Gombai Sándor
11
@GuntramBlohm Nie jest wcale jasne, że OP rozumie, jak działa ekran, i jest to najbardziej pożądany efekt.
Chrylis
2
Czy zdajesz sobie sprawę, że screen nie jest terminalem innym niż xterm, ale warstwą (pseudo terminalem), którą można podłączyć do twojego prawdziwego terminalu (vterm, xterm, terminator, (m) rxvt, any) po odłączeniu go od innego terminalu? A screen jest tym, co sprawia, że ​​proces działa tak, jak uruchomiłeś go na ekranie (i robi to dobrze). Jeśli zabijesz (naprawdę zabijesz) ekran, wyciągniesz dywan spod procesu ... Po prostu nie widzę żadnego dobrego powodu, aby to zrobić.
Gombai Sándor,
1
@ GombaiSándor: Jednym z powodów, dla których warto to zrobić, byłoby skierowanie procesu bezpośrednio do terminala w celu przejścia przez funkcje, o których ekran nie wie. Na przykład kiedyś zhakowałem własną wersję xterm, aby wszystkie dziwne klawisze funkcyjne na mojej klawiaturze wysyłały sekwencje specjalne, które zawierały klawisz X11 i stan pełnego modyfikatora, zamiast udawać, że to VT102 - a potem zacząłem instalować skróty klawiszowe dla nich w emacs. Sekwencje te nie przejdą przez ekran bez szwanku.
Henning Makholm