Quiero ejecutar dos comandos simultáneamente en bash en una máquina Linux. Por lo tanto, en mi ./execute.sh
script 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 2
terminado, incluso sicommand 1
todaví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 2
en su versión owait
en 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
killgroup
función, que mata todos esos procesos.fuente
set -x
al 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
%n
sintaxis para eliminar trabajos de fondo específicos en este shell. Por lo general, emitekill %1
para matar el último y único proceso en segundo plano. Con más procesos en segundo plano, usejobs
para ver primero la lista.Las versiones más nuevas de GNU Parallel harán lo que quieras:
O si
command
sigue 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
.command1
se 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 amboscommand1
ycommand2
(eche un vistazops -ef
), puede usarkill
para 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
command1
en primer plano una vez que matastecommand2
:Más información disponible aquí: http://linuxg.net/how-to-manage-background-and-foreground-processes/
fuente