Bash / ZSH: Cofanie „disown”

30

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.

nisc
źródło

Odpowiedzi:

16

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

lornix
źródło
1
To nie może być właściwe: proces nadrzędny nie może spowodować adopcji dziecka, chyba że wyjdzie. Zachowanie, które opisujesz, musi zostać wyzwolone z procesu potomnego (lub przez jądro, które robi to automatycznie, jeśli rodzic umiera). Proces nie może adoptować dziecka dobrowolnie, ale też nie może go porzucić.
Gilles „SO- przestań być zły”
1
Przepraszam. Moja wina. Zbyt uproszczone. Znów przebiegł przez źródło bash, bash nadal zachowuje własność, ale uniemożliwia przekazanie westchnienia procesowi potomnemu. Może więc być możliwe odzyskanie go, ale nie jest jeszcze wbudowane w bash (jeszcze). Z jakiegoś powodu utknąłem przy żniwie sierot i zombie przez inicjatora.
lornix
@lomix tak, ale kiedy opuścisz powłokę, z której ją wyrzuciłeś, otrzyma ppid 1, więc twoje rozumowanie jest prawidłowe. kto się zaprzecza, chyba że i tak
zaraz
1
Przepraszamy, ale ta odpowiedź jest błędna. Po prostu użyj reptyr(zobacz moją odpowiedź na przykład użycia).
Christian Pietsch,
18

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

Thom
źródło
2
Cóż, odzyskałem swój odrzucony proces vim z reptyr, więc działał on tak jak narzędzie do usuwania, którego szukałem.
hlovdal
Masz rację, @hlovdal: Ta odpowiedź jest w połowie błędna. reptyrjest rozwiązaniem, ale nie trzeba przestać używać disown. Dla jasności napisałem nową odpowiedź.
Christian Pietsch,
11

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
Christian Pietsch
źródło
2
(sudo apt-get install reptyr) Następnie otrzymałem to przy pierwszej próbie: „Jądro odmówiło pozwolenia podczas dołączania. Jeśli twój identyfikator użytkownika pasuje do celu, sprawdź wartość / proc / sys / kernel / yama / ptrace_scope. Aby uzyskać więcej informacji, zobacz /etc/sysctl.d/10-ptrace.conf "Zmieniłem wartość w obu lokalizacjach z 1 na 0 i zadziałało. Testowałem disown i reptyr procesu jako ten sam użytkownik (ipython notebook na Ubuntu 14.04 LTS). Być może jest to w porządku w przypadku rozwoju w odizolowanym środowisku ... nie jestem jednak pewien ostatecznych konsekwencji zmiany dla bezpieczeństwa. Może ktoś z doświadczeniem może
wejść
1

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, jobdirsijobtext 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ć SIGSTOPi SIGCONTdo odrzuconego procesu w celu symulacji Ctrl+ Zi bg. Nic z tego nie będzie tak wygodne jak ponowne posiadanie.

Gilles „SO- przestań być zły”
źródło
0

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.

Scott
źródło
6
Okoliczności są następujące: odrzucasz niewłaściwy proces i chcesz go odzyskać.
nisc
1
Ach Trudniej Ekran musi być wcześniej zaplanowany.
Scott,