5 votos

Los programas no aparecen en los trabajos si los inicio en segundo plano con un shell script.

Quiero lanzar tres programas (2x streamlit, 1x Python) en segundo plano con 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 &

Este script funciona (es decir, los programas arrancan bien) pero hay dos problemas:

  1. Ninguno de los procesos aparece en el jobs comando
  2. Si cierro el terminal (iTerm), todos esos procesos siguen funcionando

Si lanzo las 3 últimas líneas manualmente desde la línea de comandos, no tengo ninguno de esos problemas. ¿Qué está pasando aquí? ¿Cómo puedo solucionarlo?

5voto

David Anderson Puntos 2189

¿Qué está pasando aquí?

Tienes un proceso que ejecuta un shell. Basado en la información dada en la pregunta publicada, se asume que este es un zsh pero otros pueden ser posibles. Cuando se ejecuta el script publicado, se crea un nuevo proceso para ejecutar el script en un /bin/sh . Este nuevo proceso inicia tres nuevos trabajos en segundo plano asociados al /bin/sh . El /bin/sh termina entonces, dejando los tres trabajos como procesos huérfanos. Así, cuando el jobs los tres trabajos no aparecen, porque los tres procesos ahora huérfanos nunca fueron trabajos del zsh . Además, cuando el zsh termina, no se envían señales de tipo de terminación a los tres trabajos porque los procesos son huérfanos.

¿Cómo puedo solucionarlo?

Si es necesario que los tres trabajos aparezcan cuando el jobs se introduce un comando, entonces un . o source puede preceder a la ruta y al nombre de scripts. El scriptsscriptscripts se ejecutará en el zsh y por lo tanto la primera línea en el script publicado será ignorada. Por ejemplo, si el nombre del script es myscript y está en el directorio de trabajo actual, entonces se podría introducir cualquiera de las siguientes opciones.

. ./myscript
source ./myscript 

Si es necesario no hay necesidad de que aparezcan los tres trabajos cuando el jobs se introduce una línea que contiene el comando wait puede ser anexado al script publicado. Esto evitará que se creen huérfanos, cuando se utilice lo siguiente para ejecutar el script en segundo plano.

./myscript &

Por último, la idea de un script podría abandonarse en favor de una función. A continuación se muestra un ejemplo.

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X