Risposte:
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!".
reptyr
(vedi la mia risposta per un esempio di utilizzo).
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).
reptyr
è la soluzione, ma non è necessario smettere di usarla disown
. Per chiarezza, ho scritto una nuova risposta.
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
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
, jobdirs
e jobtext
gli 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 SIGSTOP
e SIGCONT
al processo sconosciuto per simulare Ctrl+ Ze bg
. Niente di tutto ciò sarà conveniente quanto il possedere.
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.