Terminal pogryzł człowieka: reptyr

Każdy popełnia czasami błędy. Jak np. uruchomienie długotrwałego procesu (powiedzmy – wget, make) na zdalnej sesji, którą musimy zamknąć, bo np. opuszczamy lokal. W takich chwilach człowiek oddałby wszystko, aby móc „wrzucić” uruchomiony proces w tło i reaktywować go za jakiś czas ponownie ale już z domu. Nic wielkiego, wystarczy opanować użytkowanie polecenia reptyr.

Screen, reptyr i numer PID naszego programu
Jak sama nazwa na to wskazuje, reptyr umożliwia „re-ptying” procesów. Czyli przekładając to na nasze – przenoszenie aktywowanych programów pomiędzy pseudoterminalami (PTY). To kosmicznie skomplikowane zagadnienie stanie się nam bliższe, gdy wpadniemy w sytuację jak ta opisana na samym początku. Czyli mamy jakiś program uruchomiony w sesji ssh, ale musimy połączenie zamknąć, bo np. wychodzimy (z uczelni, kafejki, itp.). Wiadomo, że nawet odesłanie procesu do tła (ctrl + z) nie pomoże – po zamknięciu sesji proces zostanie unicestwiony. Reptyr pozwala nam na uratowanie twarzy przez „wciągnięcie” naszego procesu do innego PTY (czyli naszej kolejnej sesji ssh). Jeżeli zrobimy to tak, że będzie tam już czekała sesja screen, to efekty łatwo przewidzieć. Sesję screen będzie można deaktywować i aktywować ponownie w dogodnym dla nas momencie. Pomińmy na razie dywagacje jak to działa. Ważne, że w ogóle. Zatem do dzieła.
… i program znika z innego PTY

Aby sprawnie posługiwać się reptyr, należy go doinstalować. Nie zaszkodzi również obecność w systemie screen. Czyli wykonujemy w Ubuntu, Mincie lub Debianie:

sudo apt-get install reptyr screen

Teraz otwieramy terminal i uruchamiamy jako użytkownik polecenie np. top. Otwieramy kolejny terminal i tam aktywujemy screen (wpisując takie polecenie). Tam też sprawdźmy numery PID naszych procesów:

#$ screen
#$ ps -a
PID TTY TIME CMD
12986 pts/1 00:00:00 top
12987 pts/2 00:00:00 screen
12999 pts/3 00:00:00 ps

Ponieważ chodzi nam o przeniesienie top, wykonujemy (pracujemy cały czas w terminalu z uruchomionym screen):

#$ reptyr 12986

Uwierzcie lub nie, ale w pierwszym terminalu zaobserwujemy:

[1]+ Zatrzymano top

… a w drugim pojawi się wynik prac naszego polecenia (w tym przypadku top). Co to oznacza? Ano to, że teraz spokojnie możemy zamknąć pierwszy terminal (PID 12986 nie jest już z nim związany), natomiast w drugim terminalu „mrozimy” screen za pomocą ctrl + a + d. Teraz również i ten terminal będziemy mogli zamknąć, a do naszego programu biegającego w tle dostaniemy się kiedykolwiek i skądkolwiek za pomocą screen -r.

Dla osób które otrzymują komunikat permission denied podczas próby takiego „przejęcia”:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
 

2 komentarze

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Post comment

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.