Programme werden nicht in Jobs angezeigt, wenn ich sie im Hintergrund mit einem Shell-Skript starte

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:

  1. Keiner der Prozesse wird unter dem jobsBefehl angezeigt
  2. Wenn ich das Terminal (iTerm) schließe, laufen alle diese Prozesse noch

Wenn 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?

Das Skript macht genau das, was Sie in der ersten Zeile schreiben, nicht sicher, was Ihre Frage hier ist. Was möchten Sie am Ende erreichen (oder anders gesagt, was genau muss repariert werden und wie soll es aussehen / sich verhalten)?
@nohillside Ich denke, die Prozesse, die ich starte, sollten unter angezeigt werden jobsund 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.
AFAIK jobszeigt keine Hintergrundprozesse, die von Skripten gestartet wurden (nur solche, die Sie interaktiv in der aktuellen Shell gestartet haben).
./myscriptProbieren Sie statt der Eingabe source ./myscriptoder . ./myscript.

Antworten (1)

Was ist denn hier los?

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/shwird dann beendet und lässt die drei Jobs als verwaiste Prozesse zurück. Wenn also der jobsBefehl eingegeben wird, erscheinen die drei Jobs nicht, weil drei jetzt verwaiste Prozesse nie Jobs des ursprünglichen zsh. Außerdem werden, wenn der zshbeendet wird, keine Beendigungstypsignale an die drei Jobs gesendet, weil die Prozesse verwaist sind.

Wie kann ich es reparieren?

Wenn es erforderlich ist, dass die drei Jobs bei der jobsEingabe des Befehls angezeigt werden, kann dem Pfad und Namen des Skripts ein Befehl .oder vorangestellt werden. sourceDas Skript wird im aktuellen ausgeführt zshund daher wird die erste Zeile im geposteten Skript ignoriert. Wenn beispielsweise der Name des Skripts lautet myscriptund 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 jobsBefehl eingegeben wird, dann waitkö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"
}

 

Fantastische Antwort. Obwohl, wenn ich eine kurze Frage zur Klarstellung stellen darf ... Ich weiß, dass beide .und sourcedas 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 sourceBefehl 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?