web-dev-qa-db-fra.com

exécution de la commande Shell en arrière-plan à partir d'un script

comment puis-je exécuter une commande Shell en arrière-plan à partir d'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 faire cela?

39
user248237dfsf

Laisser les citations

$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~
43
ngoozeff

Construire à partir de la réponse de ngoozeff, si vous voulez faire exécuter une commande complètement en arrière-plan (c.-à-d. Si vous voulez masquer sa sortie} et empêcher sa mort} lorsque vous fermez la fenêtre du terminal), vous pouvez le faire à la place:

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

& (le premier) détache le commande de stdin.
>/dev/null détache le session shell de stdout et stderr.
&disown supprime la commande de la liste de travaux de Shell.

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

De plus, lorsque vous placez une commande dans une variable, il est plus approprié 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 par lequel la commande sera lancée. Mais à l'intérieur d'un script shell, aucun résultat sera affiché.

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/

25
GreenRaccoon23

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 dynamiquement définira 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 assessment. Dans ce cas, je ne fais que créer des fichiers, mais vous pouvez utiliser pour créer dynamiquement des arguments aux commandes, puis exécuter en arrière-plan.

0
jyz

Par exemple, vous avez un programme de démarrage nommé run.sh pour le démarrer en tâche de fond, exécutez la ligne de commande suivante:

0
jokermt235