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 laps
salida, pero las respuestas aquí son más útiles.Respuestas:
Por defecto,
ps
no mostrará los parámetros con los que se llamó al programa. Las opciones-f
y-l
ambas mostrarán la llamada completa.dará como resultado una salida similar a:
fuente
Tienes unas cuantas opciones. Como su proceso se está ejecutando en segundo plano, puede usarlo
jobs
para encontrarlo:También puede usar
pkill
para buscar en la tabla de proceso una coincidencia de línea de comando; verbigracia:fuente
La
ps
salida (con, por ejemplo,ps aux
) incluye el ID del proceso principal. Matar al padrebash
, y sus hijos, también, serán terminados.Para una visualización ASCII del árbol de procesos, intente
pstree -p
ejecutar algunos procesos en segundo plano.fuente