Qual è un esempio pratico di utilizzo del comando suspend in Bash?


12

suspendè un comando incorporato in Bash. Quando useresti naturalmente questo comando e lo troverai utile?


1
La shell si sospende ogni volta che esegue un processo figlio, ovvero esegue un comando in cui detto comando è un programma esterno, che richiede una fork/execchiamata di sistema
the_velour_fog

1
In una shell interattiva ciò consente al processo figlio di ottenere il controllo del terminale, senza che la shell padre interagisca con il terminale, il che diventa disordinato.
the_velour_fog

2
@velour, ma ciò non richiede l'esecuzione di un comando separato in tal senso?
Ilkkachu,

@the_velour_fog Tecnicamente, la shell genitore non è sospesa (non riceve un STOPsegnale) quando si inoltra un processo figlio. Sono anche un po 'confuso dal tuo secondo commento.
Kusalananda

1
@Kusalananda ok, wait()mi sembra giusto . Ho detto che la shell si sospende ogni volta che crea un processo figlio . Non ho detto nulla sulla ricezione di segnali di stop, non avrebbe senso.
the_velour_fog

Risposte:


14

Supponiamo che manchi sia GNU screenche tmux(e X11 e console virtuali) ma desideri passare da una shell di login a un'altra shell interattiva.

Prima accedi alla console, quindi avvii una nuova shell, bloccando temporaneamente la shell di accesso. Per riavere la shell di accesso per fare un po 'di lavoro lì, lo faresti suspend. Quindi dovresti fgriavere la shell interattiva per continuare con qualunque cosa tu abbia fatto lì.

In effetti, con il controllo dei processi, la shell di accesso potrebbe generare una serie di shell interattive come processi in background a cui è possibile passare fg %1, fg %2ecc., Ma per tornare alla shell di accesso, è necessario utilizzare suspendse non si desidera manualmente kill -s STOP $$.

Si noti inoltre che Ctrl+ Zal prompt in una shell interattiva non lo sospenderà.

EDIT: inizialmente avevo una lunga sezione ipotetica sull'uso di suspendin uno script, ma poiché il comando richiede il controllo del lavoro e poiché le shell non interattive di solito non hanno il controllo del lavoro, ho eliminato quella sezione.


La sezione eliminata viene suspendsostituita da kill -s STOP $$(questo in realtà non appartiene più alla risposta, ma può comunque essere interessante per gli altri):

Supponiamo che tu abbia un processo in background (uno script) in uno script e che questo processo in background ad un certo punto debba fermarsi e attendere che il processo genitore gli dica di continuare. Questo potrebbe essere in modo che il genitore abbia il tempo di estrarre e spostare i file in posizione o qualcosa del genere.

Lo script figlio sospenderebbe ( kill -s STOP $$) e lo script padre gli invierebbe un CONTsegnale quando andava bene continuare.

Ti dà l'opportunità di implementare una sorta di sincronizzazione tra un processo genitore e un processo figlio (anche se molto basilare poiché il processo della shell genitore ha più o meno bisogno di indovinare che il processo figlio è sospeso, sebbene ciò possa essere risolto avendo il figlio trap CONTe non sospendere se quel segnale viene ricevuto troppo presto).

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.