Mam uruchomiony program w powłoce SSH. Chcę go zatrzymać i móc cofnąć jego wykonanie po powrocie.
Jednym ze sposobów, jakie o tym pomyślałem, było przeniesienie własności na powłokę ekranu, dzięki czemu działała.
Czy istnieje inny sposób postępowania?
ssh
terminal
gnu-screen
job-control
disown
levesque
źródło
źródło
Odpowiedzi:
Korzystanie z GNU
screen
jest najlepszym rozwiązaniem.Uruchamianie ekranu uruchomionego przy pierwszym logowaniu - uruchamiam
screen -D -R
, uruchamiam polecenie i albo je rozłączam, albo zawieszam,CTRL-Z
a następnie odłączam od ekranu, naciskającCTRL-A
wtedyD
.Po ponownym zalogowaniu się do urządzenia połącz się ponownie, uruchamiając
screen -D -R
. Będziesz w tej samej powłoce co wcześniej. Możesz uruchomić,jobs
aby zobaczyć zawieszony proces, jeśli to zrobiłeś, i uruchomić%1
(lub odpowiednie zadanie nr), aby ponownie go wysunąć na pierwszy plan.źródło
Możesz odwołać „własność” programu z powłoki za pomocą
disown
wbudowanego:Mówi to jednak powłoce, aby nie wysyłała
SIGHUP
sygnału do programu po wyjściu z powłoki. Program zachowa dowolne połączenie z terminalem, zwykle jako standardowe strumienie wejściowe, wyjściowe i błędów. Nie ma sposobu, aby ponownie podłączyć je do innego terminala. ( Ekran działa poprzez emulację terminala dla każdego okna, więc programy są dołączone do okna ekranu).Możliwe jest ponowne dołączenie deskryptorów plików do innego pliku poprzez dołączenie programu do debuggera (tj. Użycie
ptrace
) i wywołanie goopen
,dup
orazclose
. Jest na to kilka narzędzi; jest to podchwytliwy proces, a czasem zamiast tego powodują awarię procesu. Możliwości obejmują (linki zebrane od odpowiedzi na Jak mogę wyprzeć proces uruchomiony i powiązać go do nowej powłoce ekranu? I mogę nohup / screen jest już uruchomiony proces? ):źródło
disown
usuwa proces z listy kontroli zadań.disown -h
?fg
czykill
to i sprawdź, czy to się skończy samo.bzcat a.bz2 | grep text
)? Człowiek zareptyr
twierdzi, że nie obsługuje przenoszenia procesów z dziećmi.Aby przenieść proces między terminalami lub ponownie podłączyć odrzucony, możesz użyć np . Reptyr .
źródło
screen
odpowiedź jest oczywiście idealna, w rzeczywistości nie odpowiada na pytanie, które konkretnie wymaga sposobu przeniesienia aktualnie działającego procesu doscreen
lub podobnego. Zobacz także tę odpowiedź: serverfault.com/a/284795Moje ulubione rozwiązanie polega na tym
tmux
, że możesz odłączyć sesję i podłączyć ją ponownie w innym terminalu.Po odłączeniu się od poprzedniej sesji możesz bezpiecznie zamknąć terminal; później użyj,
tmux attach
aby wrócić do sesji, nawet jeśli się wylogowałeś.źródło
Istnieje również małe narzędzie o nazwie retty, które pozwala ponownie podłączyć działające programy do innego terminala.
źródło
Nie używam go regularnie, ale Neercs twierdzi, że to popiera. Jest to
screen
podobny program z różnymi fantazyjnymi funkcjami, takimi jak lepsze zarządzanie panelem, ale najważniejsze, co oferuje, to możliwość zaimportowania procesu do paneluźródło
ptrace
funkcję dirty ( ), ale nie tylko manipuluje deskryptorami plików, ale również rozwidla proces. Jest w stanie złapaćfind /
, ale rozbił interaktywne uderzenie.Jeśli chcesz go tylko zatrzymać i uruchomić ponownie później, możesz użyć
kill
zSTOP
lubCONT
signal.Najpierw dowiedz się o procesach PID
Następnie wyślij sygnały do tego PID wymienionego w procesie
źródło
„injcode” z ThomasHabets wydaje się być dokładnie tym, czego potrzebuję:
https://github.com/ThomasHabets/injcode
Program injcode pozwala na wstrzyknięcie dowolnego kodu do uruchomionego procesu, niezależnie od tego, czy wiedziałeś wcześniej i czy uruchomiłeś screen lub tmux
Z pliku README:
źródło
To działało dla mnie:
bg
procesjobs -l
znajdź numer procesutmux
uruchom menedżera okien powłokireptyr -L PROCESSNUMBER
reptyr
„s-L
było konieczne, aby uzyskać to do pracy:-L Like '-l', but also redirect the child's stdio to the slave.
z powodu tego błędu:
I z -L
źródło