Tengo un script bash que se parece a lo siguiente:
##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done
Me gustaría crear otro bucle for después del primero para continuar durante otros 30. Por ejemplo
##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
for i in {31..60}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done
Me gustaría que el primer conjunto de trabajos finalice antes de comenzar el nuevo conjunto. Pero debido a nohup
esto, parece que todos se ejecutan simultáneamente.
Lo hice nohup
porque me conecto de forma remota a mi servidor e inicio los trabajos allí y luego cierro mi bash. ¿Hay una solución alternativa?
wait
incorporado.Respuestas:
Querrá usar el
wait
comando para hacer esto por usted. Puede capturar todos los ID de procesos secundarios y esperarlos específicamente, o si son los únicos procesos en segundo plano que está creando su script, simplemente puede llamarwait
sin un argumento. Por ejemplo:fuente
Algunos puntos:
Si su objetivo
nohup
es evitar que una salida de shell remota mate sus procesos de trabajo, debe usarnohup
el script en sí, no los procesos de trabajo individuales que crea.Como se explica aquí ,
nohup
solo evita que los procesos reciban SIGHUP e interactúen con el terminal, pero no interrumpe la relación entre el shell y sus procesos secundarios.Debido al punto anterior, con o sin
nohup
, un simplewait
entre los dosfor
bucles hará que el segundofor
se ejecute solo después de que todos los procesos secundarios iniciados por el primerofor
hayan salido.Con un simple
wait
:Si necesita ejecutar el segundo
for
solo si no hubo errores en el primero, deberá guardar cada PID de trabajador$!
y pasarlos await
:fuente
R
occ1plus
en eltop
comandowait
hacebash
que espere los trabajos en segundo plano que generó, nada más. Puede haber alguna confusión aquí: estosfor
bucles, ¿los guardó en un archivo e invocó como un script (lo que asumí, debido a la##script
línea), o los está escribiendo a mano en el terminal?Usa el
fg
incorporado. Espera hasta que finalicen los procesos en segundo plano.Prueba
help fg
para más detalles.fuente
Si inserta algo como el siguiente segmento de código entre sus dos
for
bucles, podría ayudar.Por supuesto, si su aplicación
Rscript
tiene la posibilidad de no completarse con éxito y demorarse, es posible que su segundo ciclo for no tenga la oportunidad de ejecutarse. El segmento de código anterior supone que todos los procesos con el identificadorRscript --vanilla
se completarán y desaparecerán correctamente. Sin saber qué hace su aplicación y cómo se ejecuta, tengo que confiar en esta suposición.EDITAR
A la luz de los comentarios, esto se adaptaría mejor a sus necesidades. (incluye su código original, así como la lógica de verificación de finalización)
fuente
top
muestra aR
veces occ1plus
.ps -ef
lista. O después de cadanohup
comando, registre el PID en una variable (preferiblemente una matriz)echo ${!}
y compruebe este grupo de PID. Cuando todos desaparezcan, puede continuar con el segundofor
ciclo