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 ...

LorenVS
la source
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.

Carl Norum
la source
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).
Ani Menon
la source
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
désavouer commande et sur OSX
Ani Menon
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

Steve B.
la source
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)

Pajton
la source
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.

mluthra
la source
@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