Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

443
Vistas
Bash: ¿Cómo hacer que un script se vuelva a ejecutar como una tarea en segundo plano?

Estoy escribiendo un script de Bash que está destinado a ser utilizado como demonio. Si el usuario de mi secuencia de comandos no pasa una opción --sync a la secuencia de comandos, quiero que la secuencia de comandos se vuelva a ejecutar como una tarea en segundo plano usando esa opción. Aquí está mi código (la última parte fue robada de esta publicación SO ):

 #!/usr/bin/env bash args=("$@") # capture them here so we can use them if --sync's not passed async=true while [ $# -gt 0 ] do case "$1" in --sync) async=false ;; # other options esac shift done # if --sync isn't passed, rerun the script as a background task $async && exec nohup "${BASH_SOURCE[0]}" --sync "${args[@]}" 0<&- &> /dev/null &

Por alguna razón, parece que no funciona. Cuando hago bash -x myscript (que ayuda a depurar el script), parece que continúa incluso si $async es verdadero, lo que no pensé que sucedería ya que exec normalmente detiene la ejecución.

Del mismo modo, si ejecuto este comando desde mi terminal:

 exec nohup true 0<&- &> /dev/null &

tampoco puede salir del shell, a pesar del uso de exec . ¿Por qué es esto y qué puedo hacer para evitarlo? (Puntos de bonificación: ¿hay alguna forma de hacer esto sin crear una subcapa?)

Gracias.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

El & se aplica al comando exec en sí mismo, por lo que exec foo & bifurca una nueva subcapa asincrónica (o su equivalente, ver más abajo). Esa subcapa se reemplaza inmediatamente con foo . Si desea que el padre (es decir, su secuencia de comandos) también finalice, deberá hacerlo explícitamente con un comando de exit .

El exec probablemente no te compre nada aquí. Bash es lo suficientemente inteligente como para no iniciar una subcapa para un comando simple en segundo plano. Entonces debería ser suficiente hacer:

 if $async; then nohup "${BASH_SOURCE[0]}" --sync "${args[@]}" 0<&- &> /dev/null & exit 0 fi

No sé de una manera de hacer esto sin un subshell. Pero cuando escribe scripts de shell, obtiene subshells. Personalmente, solo usaría una variable simple y la probaría con algo como if [[ $async ]]; en lugar de ejecutar true o false , pero dado que también son incorporados bash, es bastante equivalente. En otros shells, podrían ejecutarse en subshells.

Ahora que lo pienso, dado que está reprocesando todas las opciones en la ejecución asíncrona de todos modos, también podría bifurcar y salir desde dentro de la declaración del case , por lo que no necesita la segunda verificación en absoluto:

 case "$1" in --sync) nohup "${BASH_SOURCE[0]}" --sync "${args[@]}" 0<&- &> /dev/null & exit 0 ;;
over 4 years ago · Santiago Trujillo Denunciar

0

No estoy de acuerdo con la respuesta de rici porque la pregunta establece claramente que el segundo plano solo se desea cuando --sync NO se pasa al script. Lo que se muestra parece ser un bucle infinito y no está comprobando todos los parámetros pasados. Creo que el código original estaba bien, excepto por el final "async && exec...". El siguiente reemplazo para esa línea debería funcionar:

 if [ "$async" = true ]; then nohup "${BASH_SOURCE[0]}" --sync "${args[@]}" 0<&- &> /dev/null & exit 0 fi

seguido de lo que se supone que debe hacer su código cuando se pasa --sync.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda