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.
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.
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