Qual è lo scopo del comando incorporato bash `suspend`?


22

Ho digitato help suspende ottenuto questa breve spiegazione:

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

Come capisco è: suspendscrivo e il terminale si blocca, nemmeno strg + c può sbloccarlo. Ma quando apro un altro terminale e cerco il PID per quello congelato e kill -SIGCONT PID-NRdigito un segnale SIGCONT viene inviato al terminale congelato e lo scongela, in modo che si sblocchi.

Ma qual è lo scopo reale di sospendere un terminale? Quali applicazioni quotidiane sono tipiche per questo? Cosa avevano in mente le persone che l'hanno trasformato in una shell?


2
evitare di eseguire programmi esterni (kill) per la sospensione.
Ipor Sircer,

Risposte:


23

Se si avvia una shell da un'altra shell, è possibile sospendere quella interna. Di 'quando usi sue vuoi tornare all'utente normale per un momento:

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(Se lo fai, non dimenticare la shell privilegiata aperta in background ...)

Allo stesso modo, se scappi da una shell da qualche altro programma ( !ad esempio il comando less), puoi comunque sospendere la shell. Ma non mi aspetto che molti altri programmi lo gestiscano bene quando lanciano un sottoprocesso, che poi si sospende.


1
Ho appena provato a correre vime ho fatto un tentativo :shdi ottenere una subshell (in particolare una zshsubshell). La corsa suspendmi ha fatto entrare nella shell originale (sospendeva sia la subshell che la vim).
Kevin,

1
@Kevin, in questo zshsembra più intelligente di bash, ho provato a scappare da entrambi lesse vi(di Debian vim.tiny): ho zshfermato anche l'app genitore , ho bashappeso il tutto. bashper bashlavori però.
ilkkachu,

1
non ero a conoscenza del fatto che ciò che ho digitato sudo su una subshell è stato avviato. quando ho digitato suspend nella shell principale la shell si blocca semplicemente, ma come hai mostrato, quando lo sospendo all'interno della subshell torno automaticamente alla shell principale.
Sharkant,

25

Questo è l'equivalente di premere Ctrl+Zaltri comandi.

Sospende la shell e restituisce il controllo alla shell genitore o al processo, se presente.

Esempio:

zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal)  bash
zsh$ fg
[1]  + continued  bash
bash-4.4$ pwd
/

La funzionalità deriva da csh, la shell di BSD (da cui proviene il controllo del lavoro) nei primi anni '80 .

In AT&T ksh, è un alias incorporato per kill -s STOP $$( sì, senza virgolette! )

Nel tuo caso, è bashstato probabilmente quello avviato direttamente dall'emulatore di terminale. E il tuo emulatore di terminale non si aspettava che il processo fosse sospeso.

Quello bashera un leader della sessione. Se il leader della sessione è sospeso, se consideriamo i vecchi terminali temporali, l'utente non avrà modo di riprenderlo.

bashrisolve il problema rifiutando suspendse si tratta di una shell di accesso. Ma nel tuo caso, l'emulatore di terminale probabilmente non si avvia bashin modalità di accesso, quindi la protezione non è in atto.

zshe mkshnon hanno il problema perché inviano un segnale SIGTSTP(quello anche inviato Ctrl+Z) come csh invece di SIGSTOP(e al gruppo di processi del chiamante per mkshcome in csh, e al gruppo di processi principale della shell per zsh, non $$solo il processo ). SIGTSTPviene ignorato quando viene consegnato a un gruppo di processi orfano e il gruppo del leader si qualifica. L'idea è che SIGTSTP non dovrebbe sospendere qualcosa che non può essere ripreso da un utente.

In mksho yash, si può anche usare suspendper far sospendere una subshell:

$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP)     (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2

Ciò non funzionerebbe con l' zshinvio di SIGTSTP al gruppo di processi principale anziché al chiamante. In qualsiasi shell che ha killincorporato, si può sempre usare kill -s TSTP 0invece.


4
Puoi citare un uso comune di suspend: in bash (e probabilmente molte shell): quando hai avviato un comando lungo e non vuoi interromperlo ma desideri che lo hai fatto in background (cioè, vuoi command .... &ma tu dimenticato &e ora desidero poterlo aggiungere senza interrompere il comando): è possibile:, ctrl-zquindi digitare: bgper riprendere l'attività sospesa più recente in background. (o bg %nper farlo con il numero di attività n. Utilizzare jobsper ottenere un elenco di attività sospese o in esecuzione)
Olivier Dulac,

5
@OlivierDulac, che non spiegherebbe a cosa serva il suspend comando vero e proprio .
Carattere jolly
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.