A menudo uso bash
scripts de shell para ejecutar comandos simples para muchos archivos diferentes. Por ejemplo, supongamos que tengo el siguiente bash
script, llamado script.sh
, que ejecuta el comando / programa foo
en tres archivos de texto "a.txt"
, "b.txt"
, "c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Además, suponga que foo $strname".txt"
es lento, por lo que la ejecución del script llevará mucho tiempo (horas o días, por ejemplo). Debido a esto, me gustaría usarlo nohup
para que la ejecución continúe incluso si el terminal está cerrado o desconectado. También me gustaría que el script pase inmediatamente al fondo, por lo que utilizaré el &
operador. Por lo tanto, usaré el siguiente comando para llamar script.sh
:
nohup bash script.sh &
Esto funciona bien para ejecutar el script en segundo plano y sin colgar, pero ahora suponga que me gustaría terminar la ejecución en algún momento por algún motivo. ¿Cómo puedo hacer esto?
El problema que he encontrado es que, al mirar top
, solo veo el foo
correspondiente a "a.txt"
. Puedo terminar esa foo
llamada, pero luego se llama foo
al correspondiente "b.txt"
y luego tengo que terminar esa, y así sucesivamente. ¡Para decenas o cientos de archivos de texto especificados en el for
bucle, se vuelve difícil terminar cada foo
uno por uno! Entonces, de alguna manera, necesito terminar el script de shell en sí , no las llamadas particulares emitidas desde el script de shell.
Cuando escribo el comando
ps -u myusername
donde myusername
está mi nombre de usuario, obtengo una lista de los procesos que estoy ejecutando. Pero veo dos ID de proceso diferentes llamadas bash
. ¿Cómo sé cuál de estos procesos, si corresponde, corresponde a mi llamada original nohup bash script.sh &
?
for s in a b c; do foo "$s".txt; done
nohup
habrá desaparecido cuando aparezca una lista de procesos para ver el trabajo que comenzó. Puede mirar la columna "amabilidad" en la ps
salida, pero las respuestas aquí son más útiles.