Commandes shell asynchrones


100

J'essaye d'utiliser un script shell pour démarrer une commande. Je me fiche de savoir si / quand / comment / pourquoi cela se termine. Je veux que le processus démarre et s'exécute, mais je veux pouvoir revenir immédiatement à mon shell ...


2
En relation, consultez Différence entre nohup, disown et & sur l'échange de piles Unix et Linux.
jww

1
Pour ceux qui recherchent une plus approfondie réponse que les discussions sur les différences entre nohup, &etdisown , cliquez ici pour défiler à la quatrième réponse .
noɥʇʎԀʎzɐɹƆ

Réponses:


116

Vous pouvez simplement exécuter le script en arrière-plan:

$ myscript &

Notez que c'est différent de mettre l' &intérieur de votre script, qui ne fera probablement pas ce que vous voulez.


1
Je savais que ça allait être quelque chose de facile, merci une tonne ... Linux n'est tout simplement pas mon truc, mais j'essaye de me mettre à niveau ... Btw, cela fonctionnera-t-il lorsqu'il est combiné avec nohup?
LorenVS

2
Quelle est la différence entre mettre le & sur la ligne de commande et le mettre dans le script? Je ne savais pas qu'ils étaient différents.
Jacob Sharf

8
@JacobSharf, essayez-le et vous verrez. Si le &est à l'intérieur du script et que vous n'en avez pas wait, la commande d'arrière-plan sera supprimée à la fermeture du script.
Carl Norum

Oh. Ça explique beaucoup. J'ai récemment remarqué un effet qui serait causé par cela. Le googler m'a conduit à cette page. Merci
Jacob Sharf

Si myscriptmodifie l'environnement du terminal, ex. c'est une commande d'initialisation du terminal qui n'est pas nécessaire immédiatement et qui peut être retardée, va-t-elle encore modifier l'environnement du terminal?
noɥʇʎԀʎzɐɹƆ

58

Tout le monde a juste oublié disown. Voici donc un résumé:

  • & met le travail en arrière-plan.

    • Le bloque lors de la tentative de lecture de l'entrée, et
    • Fait que le shell n'attende pas son achèvement.
  • disown supprime le processus du contrôle des tâches du shell, mais il le laisse toujours connecté au terminal.

    • L'un des résultats est que le shell ne lui enverra pas un SIGHUP(si le shell reçoit un SIGHUP, il envoie également un SIGHUPau processus, ce qui provoque normalement la fin du processus).
    • Et évidemment, il ne peut être appliqué qu'aux travaux d'arrière-plan (car vous ne pouvez pas le saisir lorsqu'un travail de premier plan est en cours d'exécution).
  • nohupdéconnecte le processus du terminal, redirige sa sortie vers nohup.outet le protège SIGHUP.

    • Le processus ne recevra aucun envoi SIGHUP.
    • Il est complètement indépendant du contrôle des travaux et pourrait en principe être utilisé également pour les travaux de premier plan (bien que ce ne soit pas très utile).
    • Habituellement utilisé avec &(comme travail d'arrière-plan).

Je ne trouve pas disownsur Debian ou OS X. Je pensais que c'était un programme, mais il me semble que je me trompe. Qu'Est-ce que c'est?
jww


6
C'est la meilleure réponse. Le plus complet.
noɥʇʎԀʎzɐɹƆ

3
Certainement la meilleure réponse, je ne sais pas pourquoi si peu de hauts
HeberLZ

1
@VladGanshin No.
Ani Menon

39
nohup cmd

ne raccroche pas lorsque vous fermez le terminal. la sortie par défaut va à nohup.out

Vous pouvez combiner cela avec un arrière-plan,

nohup cmd &

et débarrassez-vous de la sortie,

nohup cmd > /dev/null 2>&1 &

vous pouvez également disownune commande. de type cmd, Ctrl-Z, bg,disown


2
Cool, fou comment tout se combine, je pense que la commande me parviendrait au début, mais je suppose que vous pourriez simplement la mémoriser (ce que vous avez écrit ou "nohup cmd &> / dev / null 2> & 1" :))
LorenVS

Je suis tombé sur ça ce soir. Je me bats avec un script shell depuis 2 jours et cette suggestion a fait fonctionner les choses. Merci beaucoup!
JD Long

Génial, c'est très utile. Lors de l'exécution en mode arrière-plan, vous pouvez vérifier la sortie de la commande de temps en temps en utilisant tail nohup.out, cela affichera les 10 dernières lignes de la sortie de la commande. J'utilise ceci pour les travaux de sauvegarde rsync pour voir dans quel fichier il se trouve actuellement.
Martin Hansen

Et si je fais cela, mais que je souhaite arrêter le processus d'arrière-plan?
Stephan Bijzitter le

Le shell imprime un identifiant de tâche lorsque vous démarrez une tâche précisément à cette fin. Vous pouvez voir vos tâches en cours à tout moment avec jobs.
tripleee

26

Alternativement, après avoir lancé le programme, vous pouvez appuyer sur Ctrl-Z qui arrête votre programme, puis tapez

bg

qui met votre dernier programme arrêté en arrière-plan. (Utile si vous avez commencé quelque chose sans `` & '' et que vous le voulez toujours dans le fond sans le redémarrer)


2
Merci, c'est un petit truc sympa ... Commencer à vraiment apprécier certains des
bienfaits

3

screen -m -d $command$lance la commande dans une session détachée. Vous pouvez utiliser screen -rpour attacher à la session commencée. C'est un outil formidable, extrêmement utile également pour les sessions à distance. En savoir plus sur man screen.


@LadenkovVladislav Je suis certain à 95% que vous pouvez installer screen sur RedHat. J'ai sur CentOS.
BuvinJ

Sur Ubuntu, je voulais émuler la commande "start" de Windows / batch. C'est-à-dire lancer de manière asynchrone un programme de premier plan (gui) et continuer à travers un script shell. C'est exactement cela.
BuvinJ
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.