Odpowiedzi:
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).
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:
pgrep -f DISOWNED_PROCESS # to find out the PID of the disowned process
reptyr PID # insert this PID here
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
i SIGCONT
do odrzuconego procesu w celu symulacji Ctrl+ Zi bg
. Nic z tego nie będzie tak wygodne jak ponowne posiadanie.
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.