come eseguire il comando dopo il comando corrente in esecuzione in bash?


19

Sto scaricando il file con wget e voglio spegnere il mio computer al termine del download, ma ora devo andare da qualche parte :) È possibile eseguire il comando in bash in modo esatto quando il processo sarà terminato?

So che funziona:

wget http://example.com/file.rar; spegnimento ora

Ma cosa succede se scrivo solo:

wget http://example.com/file.rar

2
Prendi in considerazione l'uso di && e || invece di ;. && e || controlla il valore di ritorno del comando precedente prima di eseguire il comando successivo ... nel caso in cui wget fallisca, potresti non voler chiudere.
KFro

Risposte:


31

Puoi fare qualcosa del genere:

  1. ferma l'esecuzione di wget con ctrl-z (non è fermato, è sospeso)
  2. mettilo in background (bg)
  3. corri: aspetta; spegnimento -h ora

wait attenderà tutti i programmi eseguiti in background dalla shell corrente, ovvero questo wget.

Al termine dell'attesa, l'arresto verrà avviato.


non dimenticare di mettere in primo piano (fg) l'istanza di wget al termine. Se wget è già in esecuzione, puoi metterlo in primo piano con ^ z (control-z).
Andrew Scagnelli,

4
Non è necessario a meno che tu non voglia davvero vedere la barra di avanzamento.
dmckee,

Non è necessario poiché sta lasciando la macchina per sé e poi si spegne.
Lupo,

11

In un'altra shell, utilizzare

ps -u <your username> | grep wget

per trovare il PID del comando su cui si desidera attendere, quindi

wait <PID>; shutdown -h now

in modo che l'arresto non verrà eseguito fino al termine del processo. Vedi anche la risposta di Depesz .


+1, solo una nota: waitfunzionerà solo per i comandi avviati dalla stessa shell
Chriki il

5

Le mie soluzioni sono queste: sospendi l'attività di lunga durata con Control + Z, quindi digita qualcosa del tipo:

fg; echo "Done!"

Se si desidera eseguire la reazione in modo diverso in base all'esito positivo o negativo del comando, utilizzare && e || come operatori di corto circuito.

fg && echo "Success!" || echo "Failure!"

EDIT: Questo non funzionerà con sudo, perché chiederà la tua password. Di conseguenza, ho rimosso gli esempi usando sudo. Se hai bisogno di sudo per la seconda attività, usa un altro dei metodi pubblicati qui.

D'altra parte, credo che sia GNOME sia KDE offrano modi per innescare un arresto / riavvio senza usare sudo, inviando un segnale D-Bus appropriato o qualcosa del genere.


+1 per fg..., ma sudopotrebbe essere un problema se ti viene richiesta una password
mark4o

Hmm. Sì, non ho usato questo trucco per eliminare le cose quando qualcosa finisce. Per sudo, avresti bisogno di un trucco diverso. Modificherò il mio post di conseguenza.
Ryan C. Thompson,

Per il mio scopo questa risposta è superiore in quanto riporta automaticamente in primo piano il processo
Cookie

Inoltre, le password per sudo possono essere disabilitate (per utente e per comando) - se l'utente è autorizzato a chiudere tramite sudo questo una volta, potrebbe essere autorizzato a farlo sempre. Un arresto ostile potrebbe non essere così pericoloso in alcuni casi - certamente non pericoloso come un accesso guest compromesso su una macchina in esecuzione.
Cookie

1

Sì, basta digitare il secondo comando e premere Invio. Se il tuo programma attuale sta scorrendo il testo, non puoi vedere cosa stai digitando correttamente, quindi guarda i tuoi tasti in modo da farlo bene.

Un modo più intelligente è quello di passare a un altro TTY (da CTRL + ALT + da F1 a F6) ed eseguire il comando contemporaneamente, oppure se si utilizza un programma da riga di comando come lo schermo è possibile creare una nuova finestra al suo interno.


+1 per la prima opzione. Temo di non capire come dovrebbe funzionare la seconda opzione.
innaM,

Premendo ad esempio CTRL + ALT + F2 si passerà a una nuova seconda console in cui è possibile accedere e digitare un comando, in questo modo è possibile eseguire un secondo comando lì. In secondo luogo, se scarichi la schermata (un programma per utilizzare la tua console in un modo più elaborato) puoi aprire una seconda scheda / finestra in cui puoi digitare nuovamente i comandi, senza dover accedere nuovamente. Ma poiché ne hai bisogno contemporaneamente, puoi rimanere con l'opzione 1, non penso che ci sia un altro modo per ottenere lo stesso effetto. A meno che non si usi un'altra finestra / TTY per controllare attraverso uno script se il processo è ancora in esecuzione. :-P
Tamara Wijsman

Usa l'attesa PID dalla risposta di dmckee
Cookie

1

Se vuoi divertirti, controlla lo stato di ritorno della wget e spegni solo se ha avuto successo.

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi

2
Questo è un buon approccio durante wgetla creazione di script, ma durante l' esecuzione non viene richiesto di compilare il test.
dmckee,

Puoi combinarlo con il mio Control-Z e il trucco fg per aggirare quello.
Ryan C. Thompson,
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.