172 votes

Que signifie le "&" à la fin d'une commande linux ?

Je suis un 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 & le signe, a-t-il une signification particulière ?

J'ai une connaissance de base du shell mais je n'ai jamais vu cela auparavant.

14 votes

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.

0 votes

Voir aussi équivalent Windows .

237voto

mgarciaisaia Points 3287

El & permet d'exécuter la commande en arrière-plan.

De man bash :

Si une commande est interrompue par l'opérateur de contrôle & le shell exécute la commande en arrière-plan dans un sous-shell. L'interpréteur de commandes n'attend pas la fin de la commande, et l'état de retour est 0.

1 votes

Est-il possible d'attendre que tous les & des appels pour terminer ?

1 votes

@chovy oui, avec le wait commandement.

33voto

Timothy Jannace Points 344

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

sh my_script.sh &

Un processus de fond pas restent en vie après la fermeture de la session du shell. SIGHUP met fin à tous les processus en cours. Par défaut en tout cas. Si votre commande est longue ou s'exécute indéfiniment (par exemple, un microservice), vous devez la suspendre avec nohup pour qu'elle reste en cours d'exécution après votre 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 mai fermer votre processus en fonction de votre OS et de vos configurations locales (notamment sur CENTOS/RHEL) : https://serverfault.com/a/117157 .

19voto

Zack S Points 33

En outre, vous pouvez utiliser le signe "&" pour exécuter plusieurs processus par le biais d'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 second processus écoute les messages afin de télécharger des fichiers : En utilisant le "&", je peux exécuter les deux services dans un seul terminal, via une seule connexion ssh à mon serveur.

Ces processus exécutés par le "&" resteront également "en vie" après la fermeture de la session ssh. Très pratique et utile si la connexion ssh au serveur est interrompue et qu'aucun multiplexeur de terminal (screen, tmux, byobu) n'a été utilisé.

1 votes

nohup maintiendra les processus en vie aussi.

4 votes

Avec & nous pouvons obtenir le PID aussi bien que nous pouvons terminer le processus si nous voulons et aussi nous pouvons vérifier le statut de ce processus

0 votes

Comment mettre fin au processus ? Comment obtenir le PID ?

4voto

Kaustubh Kislay Points 41

Je ne suis pas sûr, mais je lis un livre en ce moment et ce que je comprends, c'est qu'un programme doit gérer son signal (comme lorsque j'appuie sur la touche CTRL-C ). Maintenant, un programme peut utiliser SIG_IGN pour ignorer tous les signaux ou SIG_DFL pour rétablir l'action par défaut.

Maintenant, si vous faites $ command & alors ce processus fonctionnant en arrière-plan ignore simplement tous les signaux qui se produiront. Pour les processus d'avant-plan, ces signaux ne sont pas ignorés.

2voto

Om Prakash Sao Points 1521

Si vous avez une commande qui s'exécute et ne renvoie pas rapidement le statut 0 (contrôle de l'invite).

Par exemple :

  1. commande gedit lance l'éditeur par défaut gedit UI.

  2. commande eclipse lance l'IDE eclipse.

Ces commandes continuent de jeter les journaux d'activités dans le terminal et ne renvoient pas l'invite de commande.

La question est de savoir comment exécuter ces commandes en arrière-plan afin de récupérer le terminal de commande et de pouvoir l'utiliser pour d'autres tâches.

La réponse est : en ajoutant & après cette commande.

 user@mymachine:~$ <command> &

Exemples :

user@mymachine:~$ edit &
user@mymachine:~$ eclipse &

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X