Czy istnieje sposób na „ponowne dołączenie” procesu do tabeli zadań powłoki po jego „odrzuceniu”?
Edycja: $ SEARCHENGINE całkowicie mnie zawodzi. Nie wygląda zbyt dobrze.
Biorąc pod uwagę, jak działają zadania linuksowe i własność procesów, obawiam się, że naprawdę nie jest możliwe ponowne posiadanie procesu bez pomocy procesu adopcji.
Rodzic może „odrzucić” dziecko, które jest następnie „adoptowane” przez proces o nazwie „init”. Bezpieczeństwo systemu uniemożliwia komuś przechwycenie procesów innej osoby. Kiedy go odrzucasz, proces staje się kontrolowany przez kogoś innego (inicjatora). Ty jako „użytkownik” nadal możesz zabić proces, ale nie możesz go odzyskać. Próba zmuszenia init do zwrócenia twojego procesu raczej nie zadziała, ponieważ init nawet nie czyta poczty.
Choć wrednie to brzmi, tak naprawdę sprowadza się do odpowiedzi „Nie rób tego!”.
reptyr
(zobacz moją odpowiedź na przykład użycia).Chociaż zakładam, że to nie pomoże nikomu w niefortunnej sytuacji, że odrzuciłem niewłaściwy proces, jeśli miałbyś wyrzucić disown z przepływu pracy i zastąpić go:
https://github.com/nelhage/reptyr
Będziesz w stanie odtworzyć każdy proces (tj. Przenieść go do ekranu).
źródło
reptyr
jest rozwiązaniem, ale nie trzeba przestać używaćdisown
. Dla jasności napisałem nową odpowiedź.Wszystko czego potrzebujesz to
reptyr
. Żyje w GitHub i został zapakowany dla Debiana od Wheezy i prawdopodobnie także dla innych dystrybucji GNU / Linux. Na pierwszym planie wyrzuci twój odrzucony proces w bieżącym terminalu, jeśli wywołasz go z jego identyfikatorem procesu (PID). Na przykład:źródło
Przepraszam, nie. Zasadniczo byłoby to możliwe, ponieważ odrzucenie jedynie zmienia stan wewnętrzny powłoki - w zasadzie usuwa identyfikator procesu z listy i można go było przywrócić bez większych problemów (trzeba by być ostrożnym przy testowaniu tego ponownie dołączony pid ma właściwą sesję, ale nie jest to niemożliwe do pokonania). Ale żadna ze zwykłych powłok (bash, ksh, tcsh, zsh) nie wydaje się mieć możliwości ponownego dodania. (Chociaż w Zsh możesz pisać do
jobstates
,jobdirs
ijobtext
asocjacyjne tablice; nie wiem, jak wiele można osiągnąć w ten sposób.)Jeśli chcesz, aby powłoka wysyłała sygnały do odrzuconego procesu, tak jak robi to w przypadku własnych podprocesów, możesz napisać zadanie pośredniczące, które czeka, aż otrzyma sygnał i wyśle ten sam sygnał do odrzuconego procesu. Możesz wysłać
SIGSTOP
iSIGCONT
do odrzuconego procesu w celu symulacji Ctrl+ Zibg
. Nic z tego nie będzie tak wygodne jak ponowne posiadanie.źródło
Jakie są okoliczności? Jeśli chcesz odzyskać terminal na chwilę, możesz zamiast tego użyć GNU Screen . To nie całkiem odłączyć proces z terminala - Ekran emuluje jeden za korzystne dla procesu - ale można podłączyć i odłączyć go od rzeczywistego terminalu że używasz. Możesz nawet odłączyć ekran, wylogować się, a następnie zalogować się ponownie i ponownie dołączyć do tego samego ekranu.
źródło