Ich möchte drei Programme (2x Streamlit, 1x Python) im Hintergrund mit einem Shell-Skript starten:
#!/bin/sh
cd /Users/mc/src/crypto/ || exit
streamlit run dashboard.py &
streamlit run dashboard_basis_viewer.py &
/Users/mc/.virtualenvs/crypto/bin/python basis_calculator.py &
Dieses Skript funktioniert (dh die Programme starten einwandfrei), aber es gibt zwei Probleme:
jobs
Befehl angezeigtWenn ich die letzten 3 Zeilen manuell über die Befehlszeile starte, bekomme ich keines dieser Probleme. Was ist denn hier los? Wie kann ich es reparieren?
Sie haben einen Prozess, der eine Shell ausführt. Basierend auf den Informationen in der geposteten Frage wird davon ausgegangen, dass dies eine ist zsh
, aber andere können möglich sein. Wenn das gepostete Skript ausgeführt wird, wird ein neuer Prozess erstellt, um das Skript in einer /bin/sh
. Dieser neue Prozess startet drei neue Hintergrundjobs, die mit der /bin/sh
. Der /bin/sh
wird dann beendet und lässt die drei Jobs als verwaiste Prozesse zurück. Wenn also der jobs
Befehl eingegeben wird, erscheinen die drei Jobs nicht, weil drei jetzt verwaiste Prozesse nie Jobs des ursprünglichen zsh
. Außerdem werden, wenn der zsh
beendet wird, keine Beendigungstypsignale an die drei Jobs gesendet, weil die Prozesse verwaist sind.
Wenn es erforderlich ist, dass die drei Jobs bei der jobs
Eingabe des Befehls angezeigt werden, kann dem Pfad und Namen des Skripts ein Befehl .
oder vorangestellt werden. source
Das Skript wird im aktuellen ausgeführt zsh
und daher wird die erste Zeile im geposteten Skript ignoriert. Wenn beispielsweise der Name des Skripts lautet myscript
und sich im aktuellen Arbeitsverzeichnis befindet, könnte eine der folgenden Eingaben gemacht werden.
. ./myscript
source ./myscript
Wenn es nicht nötig ist, dass die drei Jobs erscheinen, wenn der jobs
Befehl eingegeben wird, dann wait
könnte eine Zeile, die den Befehl enthält, an das gepostete Skript angehängt werden. Dadurch wird verhindert, dass die Waisenkinder erstellt werden, wenn Folgendes verwendet wird, um das Skript im Hintergrund auszuführen.
./myscript &
Schließlich könnte die Idee eines Skripts zugunsten einer Funktion aufgegeben werden. Unten ist ein Beispiel.
myfunction()
{
local "cwd=$(pwd)"
cd /Users/mc/src/crypto/
local "n=$?"
if [[ n -eq 0 ]]; then
streamlit run dashboard.py &
streamlit run dashboard_basis_viewer.py &
/Users/mc/.virtualenvs/crypto/bin/python basis_calculator.py &
n="$?"
fi
cd "$cwd"
return "$n"
}
.
und source
das gleiche Ergebnis haben ... aber nur meistens, zumindest auf meinem System meiner Erfahrung nach. Wenn ich versuche, ein Skript mit dem .
Alias aus einer Subshell in einem anderen Skript zu beziehen, schlägt dies fehl. Nur der source
Befehl funktioniert. Ich habe immer angenommen, dass dies darauf zurückzuführen ist, dass der Alias nicht auf einen globalen Bereich festgelegt wurde und die Subshell meine .bash_profile / .bashrc / etc. nicht lädt. Aber wenn ich Ihre Antwort lese, wird mir klar, dass ich nur angenommen habe das all die Jahre. Bin ich in der Nähe?
kein Hang
mchangun
jobs
und die Prozesse sollten beendet werden, wenn ich das Terminal verlasse. Dies sind die Verhaltensweisen, wenn ich die Prozesse in der Befehlszeile gestartet habe, im Gegensatz zu einem Skript.kein Hang
jobs
zeigt keine Hintergrundprozesse, die von Skripten gestartet wurden (nur solche, die Sie interaktiv in der aktuellen Shell gestartet haben).David Anderson
./myscript
Probieren Sie statt der Eingabesource ./myscript
oder. ./myscript
.