78 votes

exécution d'une commande shell en arrière-plan depuis script

Comment puis-je exécuter une commande shell en arrière-plan à partir d'un bash script, si la commande est dans une chaîne de caractères ?

Par exemple :

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

"$cmd &";
"$othercmd &";

cela ne fonctionne pas -- comment puis-je faire ?

80voto

GreenRaccoon23 Points 1471

En s'appuyant sur ngoozeff Si vous voulez faire en sorte qu'une commande s'exécute, la réponse est la suivante complètement en arrière-plan (c'est-à-dire, si vous voulez cacher sa sortie y empêcher qu'il soit tué lorsque vous fermez sa fenêtre Terminal), vous pouvez faire ceci à la place :

cmd="google-chrome";
"${cmd}" &>/dev/null & disown;
  • &>/dev/null définit les paramètres de la commande stdout y stderr a /dev/null au lieu de les hériter du processus parent.
  • & permet au shell d'exécuter la commande en arrière-plan.
  • disown supprime le travail "courant", le dernier arrêté ou mis en arrière-plan, du contrôle des travaux du shell.

Dans certaines coquilles, vous pouvez également utiliser &! au lieu de & disown ; ils ont tous deux le même effet. Bash ne supporte pas &! mais

De même, lorsqu'on place une commande à l'intérieur d'une variable, il est plus correct d'utiliser eval "${cmd}" plutôt que "${cmd}" :

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

Si vous exécutez cette commande directement dans le terminal il affichera le PID du processus que la commande lance. Mais à l'intérieur d'un shell script , aucune sortie seront affichés.

Voici une fonction pour cela :

#!/bin/bash

# Run a command in the background.
_evalBg() {
    eval "$@" &>/dev/null & disown;
}

cmd="google-chrome";
_evalBg "${cmd}";

Voir aussi : Exécution correcte des commandes bash en arrière-plan

77voto

ngoozeff Points 2360

Laissez tomber les citations

$cmd &
$othercmd &

eg :

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~

3voto

jyzuz Points 1657

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 va créer 20 fichiers et dynamiquement définir 20 variables. Bien sûr, vous pourriez 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 evaluate. Dans ce cas, je ne fais que créer des fichiers, mais vous pourriez l'utiliser pour créer dynamiquement des arguments aux commandes, et ensuite les exécuter en arrière-plan.

2voto

jokermt235 Points 184

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

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