Bash / ZSH: annullamento 'disown'


30

C'è un modo per "ricollegare" un processo alla tabella dei lavori delle shell dopo che è stato "rinnegato"?

Modifica: $ SEARCHENGINE mi ha completamente deluso. Non sembra troppo bello.

Risposte:


16

Considerando come funzionano i lavori di linux e la proprietà dei processi, temo che non sia davvero possibile possedere un nuovo processo senza l'aiuto del processo di adozione.

Un genitore può "rinnegare" un figlio, che viene poi "adottato" dal processo denominato "init". La sicurezza del sistema impedisce a qualcuno di afferrare i processi di qualcun altro. Quando lo rinneghi, un processo diventa qualcun altro (init) da controllare. Come "utente" potresti ancora terminare il processo, ma non puoi ripristinarlo. È improbabile che il tentativo di forzare init per restituire il processo funzioni, poiché init non legge nemmeno la posta.

Per quanto meschino, si riduce davvero alla risposta di "Non farlo!".


1
Questo non può essere giusto: il processo genitore non può causare l'adozione del figlio se non uscendo. Il comportamento che descrivi deve essere innescato dal processo figlio (o dal kernel, che lo fa automaticamente se il genitore muore). Un processo non può adottare volontariamente un bambino ma non può nemmeno rinunciarvi.
Gilles 'SO- smetti di essere malvagio' il

1
Mie scuse. Colpa mia. Semplificato troppo. Passò di nuovo attraverso la fonte bash, bash mantiene ancora la proprietà, ma impedisce che il sospiro venga passato al processo figlio. Quindi potrebbe essere possibile ripristinarlo, ma non è ancora incorporato in bash. Per qualche motivo mi sono bloccato sulla raccolta di orfani e zombi da parte di init.
lornix,

@lomix sì, ma quando esci dalla shell da cui l'hai rinnegato, allora ottiene un ppid di 1. quindi il tuo ragionamento è valido. che rinnega a meno che non
stiano

1
Ci dispiace, ma questa risposta è sbagliata. Basta usare reptyr(vedi la mia risposta per un esempio di utilizzo).
Christian Pietsch,

18

Anche se presumo che ciò non aiuti nessuno nella sfortunata situazione di aver rinnegato il processo sbagliato, se dovessi bandire il rifiuto dal tuo flusso di lavoro e sostituirlo con:

https://github.com/nelhage/reptyr

Saresti in grado di ripartire qualsiasi processo (cioè spostarlo all'interno dello schermo).


2
Bene, ho ripreso il mio rinomato processo vim con reptyr, quindi ha funzionato proprio come l'utilità non-disdetta che stavo cercando.
hlovdal

Hai ragione, @hlovdal: questa risposta è quasi sbagliata. reptyrè la soluzione, ma non è necessario smettere di usarla disown. Per chiarezza, ho scritto una nuova risposta.
Christian Pietsch,

11

Tutto ciò che serve è reptyr. Vive su GitHub ed è stato impacchettato per Debian da Wheezy, e probabilmente anche per altre distribuzioni GNU / Linux. Metterà in primo piano il processo sconosciuto nel terminale corrente se lo invochi con il suo ID processo (PID). Quindi per esempio:

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here

2
(sudo apt-get install reptyr) Quindi ottengo questo al primo tentativo: "Il kernel ha negato l'autorizzazione durante il collegamento. Se il tuo uid corrisponde al target, controlla il valore di / proc / sys / kernel / yama / ptrace_scope. Per maggiori informazioni, vedi /etc/sysctl.d/10-ptrace.conf "Ho cambiato il valore in entrambe le posizioni da 1 a 0 e ha funzionato. Ho testato il rinvio e la replica di un processo come lo stesso utente (notebook ipython su Ubuntu 14.04 LTS). Forse questo va bene per lo sviluppo in un ambiente isolato ... non sono sicuro delle ultime conseguenze sulla sicurezza del cambiamento. Forse qualcuno con esperienza può
entrare

1

Scusa no. In linea di principio, sarebbe possibile, poiché il rinnegamento modifica semplicemente uno stato interno della shell: rimuove sostanzialmente l'ID del processo da un elenco e potrebbe essere rimesso senza troppe seccature (dovresti fare un po 'di attenzione nel testarlo il pid ricollegato è nella sessione giusta, ma non è insormontabile). Ma nessuna delle solite shell (bash, ksh, tcsh, zsh) sembra avere un modo per aggiungere nuovamente. (Anche se con zsh è possibile scrivere al jobstates, jobdirse jobtextgli array associativi, non so quanto si può ottenere in questo modo.)

Se si desidera che la shell invii segnali al processo sconosciuto come fa per i suoi sottoprocessi posseduti, è possibile scrivere un processo di stub che attende fino a quando non riceve un segnale e invia lo stesso segnale al processo sconosciuto. È possibile inviare SIGSTOPe SIGCONTal processo sconosciuto per simulare Ctrl+ Ze bg. Niente di tutto ciò sarà conveniente quanto il possedere.


0

Quali sono le circostanze? Se vuoi solo riavere il tuo terminale per un po ', puoi invece usare GNU Screen . Non distacca del tutto il processo da un terminale - Lo schermo emula uno a beneficio del processo - ma è possibile collegarlo e staccarlo dal terminale reale che si sta utilizzando. È anche possibile staccare una schermata, disconnettersi, quindi riconnettersi e ricollegarsi alla stessa schermata.


6
Le circostanze sono: hai rinnegato il processo sbagliato e vuoi recuperarlo.
nisc,

1
Ah. Più forte. Lo schermo deve essere pianificato in anticipo.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.