it-swarm.com.de

ausführen des Shell-Befehls im Hintergrund vom Skript aus

wie kann ich einen Shell-Befehl im Hintergrund aus einem Bash-Skript ausführen, wenn sich der Befehl in einer Zeichenfolge befindet?

Zum Beispiel:

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

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

das geht nicht - wie kann ich das machen?

39
user248237dfsf

Lassen Sie die Anführungszeichen weg

$cmd &
$othercmd &

z.B:

[email protected] /tmp
$ cat test
#!/bin/bash

cmd="ls -la"

$cmd &


[email protected] /tmp
$ ./test

[email protected] /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

Aufbauend auf der Antwort von ngoozeff, wenn Sie einen Befehl vollständig im Hintergrund ausführen möchten (dh, wenn Sie - verbirgt die Ausgabe und verhindert, dass es getötet wird wenn Sie das Terminalfenster schließen), können Sie dies stattdessen tun:

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

& (der erste) löst den Befehl von stdin.
>/dev/null trennt die Shell-Sitzung von stdout und stderr.
&disown entfernt den Befehl aus der Jobliste der Shell.

Sie können auch &! anstatt &disown; Sie sind beide der gleiche Befehl.

Wenn Sie einen Befehl in eine Variable einfügen, ist die Verwendung von eval "${cmd}" eher, als "${cmd}":

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

Wenn Sie diesen Befehl ausführen direkt im Terminal, wird die PID des Prozesses angezeigt, den der Befehl startet. Aber innerhalb eines Shell-Skripts, wird keine Ausgabe angezeigt.

Hier ist eine Funktion dafür:

#!/bin/bash

# Run a command in the background.
_evalBg() {
    eval "[email protected]" &>/dev/null &disown;
}

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

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

28
GreenRaccoon23

Dies funktioniert, da es sich um eine statische Variable handelt.

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

Dieser Code erstellt 20 Dateien und dynamisch 20 Variablen. Natürlich können Sie ein Array verwenden, aber ich zeige Ihnen nur die Funktion :). Beachten Sie, dass Sie die Variablen $ Dateiname1, $ Dateiname2, $ Dateiname3 ... verwenden können, da sie mit dem Befehl zum Auswerten erstellt wurden. In diesem Fall erstelle ich nur Dateien. Sie können jedoch dynamische Argumente für die Befehle erstellen und dann im Hintergrund ausführen.

0
jyz

Zum Beispiel haben Sie ein Startprogramm namens run.sh, um es im Hintergrund zu starten. Führen Sie dazu die folgende Befehlszeile aus ../run.sh &>/dev/null &

0
jokermt235