Quiero ejecutar dos comandos simultáneamente en bash en una máquina Linux. Por lo tanto, en mi ./execute.shscript bash pongo:
command 1 & command 2
echo "done"
Sin embargo, cuando quiero detener el script bash y presionar Ctrl+ C, solo se detiene el segundo comando. El primer comando sigue ejecutándose. ¿Cómo me aseguro de que se detenga el script bash completo? O, en cualquier caso, ¿cómo detengo ambos comandos? Porque en este caso, no importa con qué frecuencia presione Ctrl+, Cel comando sigue ejecutándose y me veo obligado a cerrar el terminal.

Respuestas:
Si escribes
esto es igual a
es decir, esto ejecutará el primer comando en segundo plano y luego ejecutará el segundo comando en primer plano. Especialmente esto significa que
echo "done"se imprime una vezcommand 2terminado, incluso sicommand 1todavía se está ejecutando.Probablemente quieras
Esto ejecutará ambos comandos en segundo plano y esperará a que ambos se completen.
Si presiona CTRL-C, esto solo enviará la señal SIGINT al proceso de primer plano, es decir,
command 2en su versión owaiten mi versión.Sugeriría establecer una trampa como esta:
Con la trampa, la señal SIGINT producida por CTRL-C queda atrapada y reemplazada por la
killgroupfunción, que mata todos esos procesos.fuente
set -xal comienzo de su script para imprimir los comandos que se ejecutan.Al colocar un comando en segundo plano desde un script, el PID no se muestra en la pantalla. Puede usar la variable integrada
$!que almacena el PID del último proceso para poder capturar el PID del comando1.haría eco del PID del comando1.
Bash también proporciona la trampa incorporada que puede usar para registrar una secuencia de comandos para ejecutar cuando se reciben señales particulares. Puede usar esto para capturar el comando SIGINT y kill1 antes de salir del script principal, por ejemplo
Ahora, mientras el comando 2 se está ejecutando, presionar Ctrl Chará que el comando1 y el comando2 se envíen SIGINT.
fuente
%nsintaxis para eliminar trabajos de fondo específicos en este shell. Por lo general, emitekill %1para matar el último y único proceso en segundo plano. Con más procesos en segundo plano, usejobspara ver primero la lista.Las versiones más nuevas de GNU Parallel harán lo que quieras:
O si
commandsigue siendo el mismo:Mire el video de introducción para una introducción rápida: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Recorre el tutorial (man parallel_tutorial). Usted ordena línea con amor por ello.
fuente
Ctrl+ Cenvía una señal SIGINT a su proceso frontal, que es
command2.command1se ejecuta en segundo plano, por lo tanto, no se ve afectado por la secuencia de entrada.Cuando
command1 &escribes, bash debería darte el proceso 'PID, algo así como[1234]. Para matar este proceso, puedes usarkill 1234. Ahora, si tiene los PID de amboscommand1ycommand2(eche un vistazops -ef), puede usarkillpara terminarlos todos:Un pequeño truco sería ejecutar ambos comandos en segundo plano, con:
Bash te dará los dos PID, listos para que te maten. Otro truco sería volver a poner
command1en primer plano una vez que matastecommand2:Más información disponible aquí: http://linuxg.net/how-to-manage-background-and-foreground-processes/
fuente