exécuter une commande shell en arrière-plan à partir d’un script

Comment puis-je exécuter une commande shell en arrière-plan depuis un script bash, si la commande est dans une chaîne?

Par exemple:

#!/bin/bash cmd="nohup mycommand"; other_cmd="nohup othercommand"; "$cmd &"; "$othercmd &"; 

Cela ne fonctionne pas – comment puis-je le faire?

Laissez les guillemets

 $cmd & $othercmd & 

par exemple:

 nicholas@nick-win7 /tmp $ cat test #!/bin/bash cmd="ls -la" $cmd & nicholas@nick-win7 /tmp $ ./test nicholas@nick-win7 /tmp $ total 6 drwxrwxrwt+ 1 nicholas root 0 2010-09-10 20:44 . drwxr-xr-x+ 1 nicholas root 4096 2010-09-10 14:40 .. -rwxrwxrwx 1 nicholas None 35 2010-09-10 20:44 test -rwxr-xr-x 1 nicholas None 41 2010-09-10 20:43 test~ 

En vous ngoozeff la réponse de ngoozeff , si vous voulez exécuter une commande complètement en arrière-plan (par exemple, si vous voulez masquer sa sortie et l’ empêcher d’être supprimée lorsque vous fermez sa fenêtre Terminal), vous pouvez le faire à la place:

 cmd="google-chrome"; "${cmd}" &>/dev/null &disown; 

& (le premier) détache la commande de stdin .
>/dev/null détache la session shell de stdout et stderr .
&disown supprime la commande de la liste des tâches du shell .

Vous pouvez aussi utiliser &! au lieu de &disown ; ils sont tous les deux la même commande.

De plus, lorsque vous placez une commande à l’intérieur d’une variable, il est préférable d’utiliser eval "${cmd}" plutôt que "${cmd}" :

 cmd="google-chrome"; eval "${cmd}" &>/dev/null &disown; 

Si vous exécutez cette commande directement dans Terminal , le PID du processus démarrera. Mais à l’ intérieur d’un script shell , aucune sortie ne sera affichée.

Voici une fonction pour cela:

 #!/bin/bash # Run a command in the background. _evalBg() { eval "$@" &>/dev/null &disown; } cmd="google-chrome"; _evalBg "${cmd}"; 

http://felixmilea.com/2014/12/running-bash-commands-background-properly/

Cela fonctionne parce que c’est une variable statique. Vous pourriez faire quelque chose de beaucoup plus cool comme ceci:

 filename="filename" extension="txt" for i in {1..20}; do eval "filename${i}=${filename}${i}.${extension}" touch filename${i} echo "this rox" > filename${i} done 

Ce code créera 20 fichiers et définira dynamicment 20 variables. Bien sûr, vous pouvez utiliser un tableau, mais je ne fais que vous montrer la fonctionnalité :). Notez que vous pouvez utiliser les variables $ filename1, $ filename2, $ filename3 … car elles ont été créées avec la commande evaluation. Dans ce cas, je ne fais que créer des fichiers, mais vous pouvez créer des arguments dynamics pour les commandes, puis les exécuter en arrière-plan.

Par exemple, vous avez un programme de démarrage nommé run.sh pour le démarrer en arrière-plan, en utilisant la ligne de commande suivante. ./run.sh &> / dev / null &