bash script das Ergebnis nicht abwarten

Atalantia

Aktives Mitglied
Thread Starter
Registriert
26.11.2009
Beiträge
1.952
Reaktionspunkte
444
Hallo Leute,
ich habe folgendes bash Script das eine Binary startet. Aber es will warten bis das Binary (Programm) das es startet beendet wird. Soll es aber nicht. Es soll das Programm starten und sich dann beenden. Ich habe ein Haufen Varianten mit dem "&" ausprobiert. Aber keine funktionierte. Das Script bleibt aktiv. Jemand 'ne Idee wie das zu bewerkstelligen ist?

Bash:
#!/bin/bash

sub=$HOME/Library/Scripts/Jackett/jackett
$sub
 
hmm habe ein ähnliches Problem, aber keine gute idee.

Ich lasse Firefox per Script mit einem bestimmten Profil starten.
und das Startscript bleibt in der menüleiste offen solange der Firefox aktiv ist.

Ich würde es auch so machen, aber der Befehl müsste ja exakt gleich sein.
Code:
#!/bin/sh
cd  ~/Library/Scripts/Jackett/
./jackett
 
Ne, kein Erfolg mit nohup. Das Ergebnis ist exakt das gleiche wie ohne.
 
vielleicht das Kommando im Script durch & ergänzen, so dass es im Hintergrund gestartet wird?
Code:
kommando &
 
Das Programm im Script mit & am Ende der Zeile startet es im Hintergrund und das Script läuft weiter. Aber da das Programm in dem Fall immer noch ein Child-Process vom Script ist, bekommt es am Ende des Scripts ein SIGHUP Signal vom Betriebssystem und wird zusammen mit dem Script beendet. Damit das Signal dein Child-Programm nicht erreicht, kann man nohup nutzen. Also

Bash:
#!/bin/bash

sub=$HOME/Library/Scripts/Jackett/jackett
nohup $sub > /dev/null 2>&1 &

Die Umleitung des Output nach /dev/null sorgt dafür, das der Output des Programms verworfen wird. Ohne diese Umleitung schreibt nohup den Output in eine Datei nohup.log. Das 2>&1 sorgt dafür, das nicht nur der Standard-Output (stdout) des Programms, sondern auch der Fehler-Output (stderr) weggeworfen werden. Wenn Du den Output behalten willst, ersetze das /dev/null durch die Datei, in der der output landen soll.

Wenn dein Programm eine mac App mit GUI wäre, wie z.B. Safari, wird auch das so nicht funktionieren. In dem Fall müsstest du zusätzlich open

Bash:
nohup open -a "$sub" > /dev/null 2>&1 &

nehmen.
 
Es ist im realen Leben noch etwas komplizierter. Das Programm nicht nur im Hintergrund starten, das macht & am Ende.

Wenn das Programm Ergebnisse liefern soll müssen die extern übertragen werden, zum Bsp über files in tmp.

Die Prozess ID festhalten und wenn das Hauptscript unterbrochen wird über einen Trap handler die PID vom Hintergrundscript beenden / abschießen.

Wenn man es nicht übertreibt, kann man da einiges beschleunigen. Darf sich aber keine race conditions schaffen, im Zweifelsfall lieber einmal mehr wait $PID einbauen um den Laden wieder auf Kurs zu halten…
 
Damit das Signal dein Child-Programm nicht erreicht, kann man nohup nutzen. Also

#!/bin/bash sub=$HOME/Library/Scripts/Jackett/jackett nohup $sub > /dev/null 2>&1 &
Die Umleitung des Output nach /dev/null sorgt dafür, das der Output des Programms verworfen wird.
Funktioniert. Ich frage mich ab und zu wie man diese Dingen lernen kann... Danke
 
Was noch fehlt ist ein vernünftiges Verfahren, den Hintergrundprozess wieder zu beenden und andererseits ggfs. zu verhindern, das er mehrfach gestartet wird, wenn Du das Script mehrfach aufrufst. Hängt davon ab, ob dein Hintergrundprozess in der Hinsicht schon selber was bietet oder nicht.
 
Das Problem hatte ich bereits gelöst. Das ganze Script sieht so aus:
Bash:
#!/bin/sh

sub=$HOME/Library/Scripts/Jackett/jackett

pgrep "jackett";pg=$?

if [ $pg = 0 ]
    then killall -9 "jackett"
    else nohup $sub > /dev/null 2>&1 &
fi
 
Zurück
Oben Unten