A menudo uso bashscripts de shell para ejecutar comandos simples para muchos archivos diferentes. Por ejemplo, supongamos que tengo el siguiente bashscript, llamado script.sh, que ejecuta el comando / programa fooen 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 nohuppara 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 foocorrespondiente a "a.txt". Puedo terminar esa foollamada, pero luego se llama fooal correspondiente "b.txt"y luego tengo que terminar esa, y así sucesivamente. ¡Para decenas o cientos de archivos de texto especificados en el forbucle, se vuelve difícil terminar cada foouno 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 myusernameestá 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
nohuphabrá desaparecido cuando aparezca una lista de procesos para ver el trabajo que comenzó. Puede mirar la columna "amabilidad" en la pssalida, pero las respuestas aquí son más útiles.