Que signifie «&» à la fin d'une commande linux?


94

Je suis administrateur système et on m'a demandé d'exécuter un script Linux pour nettoyer le système.

La commande est la suivante:

perl script.pl > output.log &

donc cette commande se termine par un &signe, y a-t-il une signification particulière?

J'ai des connaissances de base sur shell mais je n'ai jamais vu cela auparavant.


désolé mon mal, je connaissais des choses aussi basiques
Mec

2
Si vous êtes sur cette page à la recherche de la différence entre &et &&: &exécute la première commande en arrière-plan; &&exécute la première commande et passe conditionnellement à la seconde si elle se termine avec succès.
David Bodow

Réponses:


146

Le &fait que la commande s'exécute en arrière-plan.

De man bash:

Si une commande est terminée par l'opérateur de contrôle & , le shell exécute la commande en arrière-plan dans un sous-shell. Le shell n'attend pas la fin de la commande et le statut de retour est 0.


12

De plus, vous pouvez utiliser le signe «&» pour exécuter de nombreux processus via une (1) connexion ssh afin de conserver un nombre minimum de terminaux. Par exemple, j'ai un processus qui écoute les messages afin d'extraire des fichiers, le deuxième processus écoute les messages afin de télécharger des fichiers: En utilisant le "&", je peux exécuter les deux services dans un terminal, via une seule connexion ssh à mon serveur .


***** Je viens de réaliser que ces processus exécutés via le "&" "resteront en vie" après la fermeture de la session ssh! assez soigné et utile si votre connexion au serveur est interrompue **


nohupmaintiendra également les processus en vie.
Jerry Chin

2
avec & nous pouvons également obtenir le PID afin que nous puissions terminer le processus si nous le voulons et nous pouvons également vérifier l'état de ce processus
Dhaval Solanki

12

Quand on ne le dit pas autrement, les commandes prennent le dessus. Vous n'avez qu'un seul processus "de premier plan" en cours d'exécution dans une seule session shell. Le symbole & indique aux commandes de s'exécuter dans un processus d'arrière-plan et revient immédiatement à la ligne de commande pour des commandes supplémentaires.

sh my_script.sh &

Un processus d'arrière-plan ne restera pas actif après la fermeture de la session shell. SIGHUP met fin à tous les processus en cours. Par défaut de toute façon. Si votre commande dure longtemps ou s'exécute indéfiniment (c'est-à-dire: microservice), vous devez la suspendre avec nohup pour qu'elle reste en cours d'exécution après la déconnexion de la session:

nohup sh my_script.sh &

EDIT: Il semble y avoir une zone grise concernant la fermeture des processus d'arrière-plan lorsque & est utilisé. Sachez simplement que le shell peut fermer votre processus en fonction de votre système d'exploitation et des configurations locales (en particulier sur CENTOS / RHEL): https://serverfault.com/a/117157 .


1

Je ne sais pas avec certitude mais je lis un livre en ce moment et ce que j'obtiens, c'est qu'un programme doit gérer son signal (comme lorsque j'appuie sur CTRL-C). Maintenant, un programme peut utiliser SIG_IGNpour ignorer tous les signaux ou SIG_DFLpour restaurer l'action par défaut.

Maintenant, si vous le faites, $ command &ce processus s'exécutant en arrière-plan ignore simplement tous les signaux qui se produiront. Pour les processus de premier plan, ces signaux ne sont pas ignorés.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.