Uscire da zsh, ma lasciare aperti i lavori in esecuzione?


96

Sono appena passato da bash a zsh.

In bash, le attività in background continuano a essere eseguite quando la shell esce. Ad esempio qui, dolphincontinua a correre dopo exit:

$ dolphin .
^Z
[1]+  Stopped                 dolphin .
$ bg
[1]+ dolphin . &
$ exit

Questo è ciò che voglio come comportamento predefinito.

Al contrario, il comportamento di zsh è avvisare dell'esecuzione di lavori exit, quindi chiuderli di exitnuovo. Ad esempio qui, dolphinviene chiuso quando il secondo exitcomando esce effettivamente dalla shell:

 % dolphin .
^Z
zsh: suspended  dolphin .
 % bg
[1]  + continued  dolphin .
 % exit
zsh: you have running jobs.
 % exit 

Come faccio a rendere il comportamento predefinito di zsh qui come quello di bash?

Risposte:


168

Avvia il programma con &!:

dolphin &!

Il &!( o equivalentemente,&| ) è una scorciatoia zsh specifico sia bassa e rinnegare il processo, in modo tale che uscire dalla shell lascerà in esecuzione.


2
Per completezza, puoi anche elencare come rinnegarlo una volta che è già avviato?
trusktr

@trusktr C'è una domanda diversa sul rinnegare il processo in primo piano . Penso che sia meglio tenerlo separato per chiarezza. Per chiunque sia interessato in particolare a zsh, ho posto una domanda su U&L SE su come creare un flusso di lavoro più veloce per rinnegare il processo in primo piano .
Anko

Mi piace questa soluzione e la implementerò per i singoli comandi, ma sto ancora cercando un modo per modificare il comportamento predefinito di Zsh.
Vince

1
@Vince Intendi cambiare l'impostazione predefinita per rinnegare sempre i processi in background? Se è così, puoi farlo con setopt nohupnel tuo file ~/.zshrc. Quindi avviare un comando in background con &lo rinnegherà sempre. Sebbene per impostazione predefinita zsh ti ricorderà comunque che hai dei lavori in esecuzione quando tenti di uscire. Puoi disattivare anche quello con setopt nocheckjobs.
Anko

@Anko penso che setopt nocheckjobsfa quello che voglio. Ora ho trovato le opzioni disponibili in man zshoptions. Vorrei disattivare l'avviso. So quando ho processi in background e non ne ho bisogno. Mi piacerebbe che chiudesse i processi in background a meno che non li avessi avviati con nohup. Attualmente lo uso con una funzione shell che esegue PyCharm in background con nohup. Quando digito pycharm .viene eseguito nohup charm $@ &. Non si chiude quando chiudo il terminale, ma ricevo comunque l'avviso e devo digitare exitdue volte.
Vince

59

Dalla documentazione zsh :

HUP

... In zsh, se hai un lavoro in background in esecuzione quando la shell esce, la shell presumerà che tu voglia che venga ucciso; in questo caso viene inviato un segnale particolare chiamato SIGHUP... Se spesso avviate lavori che dovrebbero continuare anche quando la shell è uscita, allora potete impostare l'opzione NO_HUP, ei lavori in background verranno lasciati soli.

Quindi imposta l' NO_HUPopzione:

% setopt NO_HUP

Se non vuoi l'avvertimento, sì.
Carl Norum

30

Ho scoperto che l'uso di una combinazione di nohup, &e disownfunziona per me, poiché non voglio che i lavori vengano eseguiti in modo permanente quando la shell è uscita.

nohup <command> & disown

Anche se &ha funzionato per me in bash, ho scoperto che quando si utilizza solo nohup, &o disownin esecuzione di comandi, come uno script che chiama un comando di esecuzione java, il processo si interrompe comunque quando si esce dalla shell.

  • nohupfa sì che il comando ignori NOHUPe SIGHUPsegnali dalla shell
  • & fa in modo che il processo venga eseguito in background in un subterminal
  • disownseguito da un argomento (l'indice del numero di lavoro nell'elenco dei lavori) impedisce alla shell di inviare un SIGHUPsegnale ai processi figli. L'utilizzo disownsenza argomenti fa sì che l'impostazione predefinita sia il lavoro più recente.

Ho trovato le informazioni nohupe disownin questa pagina e le &informazioni in questa risposta SO .


5

Di solito lo uso screenper mantenere in esecuzione i lavori in background.

1) Crea una sessione dello schermo:

screen -S myScreenName

2) Avvia i tuoi script, servizi, demoni o altro

3) Esci (scollega) sessione schermo con

screen -d

o scorciatoia ALT+A then d


Dopo poche centinaia di anni, se vuoi riprendere la sessione (ricollega):

screen -r myScreenName

Se vuoi sapere se c'è una sessione di schermo, il suo nome e il suo stato (allegato o scollegato):

screen -ls

Questa soluzione funziona su tutti gli interpreti di terminale come bash, zsh ecc. Vedi anche man screen


Una nota per gli utenti di MacOS, la scorciatoia da tastiera per staccare dallo schermo era Control + A, quindi D.Questa era anche la mia unica opzione quando lasciavo un processo in esecuzione e cedevo a stdout, scrivere screen -d lì non sarebbe stato d'aiuto.
Bishoy

Bello, ma niente a che fare con la Q che riguarda specificamente come mantenere in esecuzione le attività bg quando si esce da ZSH.
RichieHH
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.