sintaxis que lista ejemplos completa comandos comando basicos bash shell scripting background-process ampersand

que - La ejecución de la secuencia de comandos bash no regresa a la terminal cuando se utiliza el signo &(&) para ejecutar un subproceso en segundo plano.



manual de comandos de linux ubuntu (2)

El siguiente enlace del Proyecto de documentación de Linux sugiere agregar una wait después de su comando de mail en child.sh :

http://tldp.org/LDP/abs/html/x9644.html

Resumen del documento anterior

Within a script, running a command in the background with an ampersand (&) may cause the script to hang until ENTER is hit. This seems to occur with commands that write to stdout. It can be a major annoyance. .... .... As Walter Brameld IV explains it: As far as I can tell, such scripts don''t actually hang. It just seems that they do because the background command writes text to the console after the prompt. The user gets the impression that the prompt was never displayed. Here''s the sequence of events: 1. Script launches background command. 2. Script exits. 3. Shell displays the prompt. 4. Background command continues running and writing text to the console. 5. Background command finishes. 6. User doesn''t see a prompt at the bottom of the output, thinks script is hanging.

Si cambia child.sh para que parezca lo siguiente, no debería experimentar esta molestia:

#!/bin/bash java com.test.Main echo "Main Process Stopped" | mail -s "WARNING-Main Process is down." [email protected] wait

O como dice @SebastianStigler en un comentario a su pregunta anterior:

Add a > /dev/null at the end of the line with mail. mail will otherwise try to start its interactive mode.

Esto hará que el comando de correo escriba en /dev/null lugar de stdout lo que también debería detener esta molestia.

Espero que esto ayude

Tengo un script (vamos a llamarlo parent.sh) que hace 2 llamadas a un segundo script (child.sh) que ejecuta un proceso java. Los scripts child.sh se ejecutan en segundo plano colocando un & al final de la línea en parent.sh. Sin embargo, cuando ejecuto parent.sh, necesito presionar Ctrl + C para volver a la pantalla del terminal. ¿Cuál es la razón para esto? ¿Tiene algo que ver con el hecho de que los procesos child.sh se ejecutan bajo el proceso parent.sh? ¿Entonces parent.sh no se muere hasta que los hijos lo hagan?

parent.sh

#!/bin/bash child.sh param1a param2a & child.sh param1b param2b & exit 0

child.sh

#!/bin/bash java com.test.Main echo "Main Process Stopped" | mail -s "WARNING-Main Process is down." [email protected]

Como puede ver, no quiero ejecutar el proceso de Java en segundo plano porque quiero enviar un correo cuando muere el proceso. Hacerlo como se muestra arriba funciona bien desde un punto de vista funcional, pero me gustaría saber cómo puedo lograr que regrese a la terminal después de ejecutar parent.sh.


Lo que terminé haciendo fue hacer para cambiar parent.sh a lo siguiente

#!/bin/bash child.sh param1a param2a > startup.log & child.sh param1b param2b > startup2.log & exit 0

No habría llegado a esta solución sin sus sugerencias y el análisis de causa raíz del problema. ¡Gracias!

Y disculpas por mi comentario inexacto. (No hubo entrada, respondí de memoria y recordé incorrectamente).