5 votes

Les programmes n'apparaissent pas dans les travaux si je les lance en arrière-plan avec un shell script.

Je veux lancer trois programmes (2x streamlit, 1x Python) en arrière plan avec un shell script :

#!/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 &

Ce script fonctionne (c'est-à-dire que les programmes démarrent bien) mais il y a deux problèmes :

  1. Aucun des processus n'apparaît sous le jobs commande
  2. Si je ferme le terminal (iTerm), tous ces processus sont toujours en cours d'exécution.

Si je lance les 3 dernières lignes manuellement à partir de la ligne de commande, je n'ai aucun de ces problèmes. Qu'est-ce qui se passe ici ? Comment puis-je le résoudre ?

5voto

David Anderson Points 30783

Qu'est-ce qui se passe ici ?

Vous avez un processus qui exécute un shell. D'après les informations données dans la question affichée, on suppose qu'il s'agit d'une zsh mais d'autres peuvent être possibles. Lorsque le script posté est exécuté, un nouveau processus est créé pour exécuter le script dans une /bin/sh . Ce nouveau processus démarre trois nouvelles tâches d'arrière-plan associées à la /bin/sh . Le site /bin/sh puis se termine, laissant les trois travaux comme des processus orphelins. Ainsi, lorsque le jobs est saisie, les trois tâches n'apparaissent pas, car ces trois processus désormais orphelins n'ont jamais été des tâches de la commande d'origine zsh . En outre, lorsque le zsh se termine, aucun signal de type terminaison n'est envoyé aux trois jobs car les processus sont orphelins.

Comment puis-je le réparer ?

S'il est nécessaire que les trois emplois apparaissent lorsque l'enquête de l jobs est saisie, alors un . o source peut précéder le chemin et le nom de scripts. Le scripts sera exécuté dans le dossier courant de l'utilisateur. zsh et donc la première ligne du script affiché sera ignorée. Par exemple, si le nom du script est myscript et se trouve dans le répertoire de travail actuel, alors l'une ou l'autre des commandes suivantes peut être saisie.

. ./myscript
source ./myscript 

En cas de besoin, il n'est pas nécessaire que les trois emplois apparaissent lorsque la jobs est saisie, puis une ligne contenant la commande wait pourrait être annexée au script affiché. Cela empêchera les orphelins d'être créés, lorsque la commande suivante est utilisée pour exécuter le script en arrière-plan.

./myscript &

Enfin, l'idée d'un script pourrait être abandonnée en faveur d'une fonction à la place. Voici un exemple.

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"
}

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X