Cosa significa "&" alla fine di un comando Linux?


94

Sono un amministratore di sistema e mi è stato chiesto di eseguire uno script Linux per pulire il sistema.

Il comando è questo:

perl script.pl > output.log &

quindi questo comando termina con un &segno, c'è qualche significato speciale in esso?

Ho una conoscenza di base della shell ma non l'ho mai vista prima.


scusatemi male, sapevo di queste cose di base
Amico

2
Se ti trovi in ​​questa pagina cercando la differenza tra &e &&: &esegue il primo comando in background; &&esegue il primo comando e procede condizionatamente al secondo se esce con successo.
David Bodow

Risposte:


146

Il &fa eseguire il comando in background.

Da man bash:

Se un comando viene terminato dall'operatore di controllo & , la shell esegue il comando in background in una subshell. La shell non attende che il comando finisca e lo stato di ritorno è 0.


12

Inoltre, è possibile utilizzare il segno "&" per eseguire molti processi attraverso una (1) connessione ssh in modo da mantenere il numero minimo di terminali. Ad esempio, ho un processo che ascolta i messaggi per estrarre i file, il secondo processo ascolta i messaggi per caricare i file: Utilizzando "&" posso eseguire entrambi i servizi in un terminale, tramite una singola connessione ssh al mio server .


***** Mi sono appena reso conto che questi processi in esecuzione attraverso "&" rimarranno "vivi" anche dopo la chiusura della sessione ssh! abbastanza pulito e utile se la tua connessione al server viene interrotta **


nohupmanterrà in vita anche i processi.
Jerry Chin

2
con e possiamo ottenere anche il PID in modo da poter interrompere il processo se lo desideriamo e possiamo anche controllare lo stato di quel processo
Dhaval Solanki

12

Quando non viene detto diversamente, i comandi prendono il sopravvento. Hai solo un processo "in primo piano" in esecuzione in una singola sessione di shell. Il simbolo & indica ai comandi di essere eseguiti in un processo in background e torna immediatamente alla riga di comando per ulteriori comandi.

sh my_script.sh &

Un processo in background non rimarrà attivo dopo la chiusura della sessione della shell. SIGHUP termina tutti i processi in esecuzione. Per impostazione predefinita comunque. Se il tuo comando è di lunga durata o viene eseguito a tempo indeterminato (ad esempio: microservizio), devi pr-penderlo con nohup in modo che rimanga in esecuzione dopo esserti disconnesso dalla sessione:

nohup sh my_script.sh &

EDIT: sembra esserci un'area grigia relativa alla chiusura dei processi in background quando viene utilizzato &. Tieni presente che la shell potrebbe chiudere il processo a seconda del sistema operativo e delle configurazioni locali (in particolare su CENTOS / RHEL): https://serverfault.com/a/117157 .


1

Non lo so per certo, ma sto leggendo un libro in questo momento e quello che ricevo è che un programma deve gestire il suo segnale (come quando premo CTRL-C). Ora un programma può utilizzare SIG_IGNper ignorare tutti i segnali o SIG_DFLper ripristinare l'azione predefinita.

Ora, se lo fai, $ command &questo processo in esecuzione come processo in background ignora semplicemente tutti i segnali che si verificheranno. Per i processi in primo piano questi segnali non vengono ignorati.

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.