Exécuter le script Bash en arrière-plan et quitter le terminal

19

Est-il possible de lancer une commande ou un terminal de sortie de script Bash et PAS d'interrompre une commande?

Ma solution était d'exécuter cron à une heure précise de la journée, mais je suis sûr qu'il y a quelque chose de plus simple.

Peter Mortensen
la source

Réponses:

45

Pour éviter que les signaux de sortie ne se propagent aux processus enfants du terminal et du shell, exécutez la commande avec nohup, c'est-à-dire:

nohup cmd &
Thor
la source
1
Ceci est la bonne réponse. Sans nohup, le processus démarré est toujours considéré comme un "enfant" du processus terminal et donc terminé si le terminal est fermé.
Izzy
3
cmd & disownfonctionne aussi, car le &est traité comme un ;séparateur de commandes. La commande disown supprime la connexion entre la session shell bash et la commande en arrière-plan.
lornix
2
zsh a un raccourci pour cela: cmd &|.
Thor
Pour que cela fonctionne, j'ai dû changer une préférence dans Terminal.app. Sous Profils, sélectionnez votre profil actif, puis Shell> Lorsque le shell se termine> Fermer si le shell est sorti proprement
Antoine
6

En utilisant screen:

screen -S <session name> -d -m <your command>

après cela, vous pouvez quitter le terminal, vous pouvez également le rattacher en:

screen -r <session name>

Plus d'infos: référence

Bruce
la source
4

Si vous souhaitez exécuter une commande ou un fichier spécifique toutes les secondes environ en arrière-plan après avoir quitté le terminal, vous pouvez essayer cette petite chose facile;

nohup watch -n5 'bash script.sh' &

Cela exécuterait scipt.sh toutes les 5 secondes.

jamietelin
la source
1
"nohup" est déjà couvert par la réponse acceptée. Et je suis à peu près sûr que le demandeur a mentionné cron parce qu'ils l'utilisaient pour dire "Exécutez cette commande quelques secondes dans le futur", pas pour l'exécuter périodiquement.
David Richerby
1
Ma réponse n'aggrave pas les choses. Voyez le point de vote vers le bas. Neural serait suffisant.
jamietelin
3

Mettez un caractère "&" après votre commande.

par exemple:

/home/your/script.sh &
Flinth
la source
7
dans ce cas, lorsque le terminal est fermé, le processus est également lancé par /home/your/script.sh- car il n'a pas été détaché de son "parent", mais simplement "en arrière-plan". Utilisez nohuppour le détacher pour de vrai.
Izzy
Mon mauvais, je ne le savais pas, mais quand j'ai testé sur mon Debian, la commande a continué à s'exécuter après la fermeture du shell qui l'a lancée: /
Flinth
1
Je ne sais pas exactement où le processus en arrière-plan est attaché et quand. Mais si vous vous connectez, par exemple, à une machine distante, il est définitivement arrêté dès que vous vous déconnectez (sauf s'il s'est démonifié ). Donc, pour être sûr à 100%, vous utilisez plutôt nohup- qui enregistre également toutes les sorties (désormais invisibles) dans un fichier appelé nohup.outsitué dans le répertoire à partir duquel vous avez démarré la commande.
Izzy
D'accord, merci pour vos explications ^^
Flinth
Cette réponse peut fonctionner correctement lorsqu'elle est combinée avec la jobscommande. Très souvent, je veux pouvoir revenir au processus shell après l'avoir mis en arrière-plan.
djangofan