Quiero iniciar tres programas (2x streamlit, 1x python) en segundo plano con un script de shell:
#!/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 se inician bien) pero hay dos problemas:
jobs
comando.Si ejecuto las últimas 3 líneas manualmente desde la línea de comando, no tengo ninguno de esos problemas. ¿Que está pasando aqui? ¿Cómo puedo arreglarlo?
Tiene un proceso que ejecuta un shell. Según la información proporcionada en la pregunta publicada, se supone que se trata de un zsh
, pero es posible que haya otros. Cuando se ejecuta el script publicado, se crea un nuevo proceso para ejecutar el script en un archivo /bin/sh
. Este nuevo proceso inicia tres nuevos trabajos en segundo plano asociados con el archivo /bin/sh
. Luego /bin/sh
finaliza, dejando los tres trabajos como procesos huérfanos. Entonces, cuando jobs
se ingresa el comando, los tres trabajos no aparecen, porque los tres procesos ahora huérfanos nunca fueron trabajos del original zsh
. Además, cuando zsh
termina, no se envían señales de tipo de terminación a los tres trabajos porque los procesos son huérfanos.
Si es necesario que aparezcan los tres trabajos cuando jobs
se ingresa el comando, entonces un comando .
o source
puede preceder a la ruta y el nombre del script. El script se ejecutará en el actual zsh
y, por lo tanto, se ignorará la primera línea del script publicado. Por ejemplo, si el nombre de la secuencia de comandos es myscript
y está en el directorio de trabajo actual, se podría ingresar cualquiera de los siguientes.
. ./myscript
source ./myscript
Si es necesario, no es necesario que aparezcan los tres trabajos cuando jobs
se ingresa el comando, luego se puede agregar una línea que contenga el wait
comando al script publicado. Esto evitará que se creen huérfanos cuando se utilice lo siguiente para ejecutar el script en segundo plano.
./myscript &
Finalmente, 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"
}
.
y source
tienen el mismo resultado... pero solo la mayor parte del tiempo, al menos en mi sistema en mi experiencia. Si intento obtener una secuencia de comandos utilizando el .
alias de una subcapa dentro de otra secuencia de comandos, falla. Solo source
funciona el comando. Siempre supuse que esto se debía a que el alias no se había establecido en un alcance global y la subcapa no cargaba mi .bash_profile / .bashrc / etc. pero al leer su respuesta, me di cuenta de que solo estaba asumiendo que todos estos años. ¿Estoy cerca?
sin ladera
mchangun
jobs
y los procesos deberían eliminarse si salgo de la terminal. Esos son los comportamientos si inicié los procesos en la línea de comandos en lugar de hacerlo desde un script.sin ladera
jobs
no muestra los procesos en segundo plano iniciados desde scripts (solo aquellos que inició de forma interactiva en el shell actual).david anderson
./myscript
, intentesource ./myscript
o. ./myscript
.