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 nohupesto, parece que todos se ejecutan simultáneamente.
Lo hice nohupporque me conecto de forma remota a mi servidor e inicio los trabajos allí y luego cierro mi bash. ¿Hay una solución alternativa?

waitincorporado.Respuestas:
Querrá usar el
waitcomando 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 llamarwaitsin un argumento. Por ejemplo:fuente
Algunos puntos:
Si su objetivo
nohupes evitar que una salida de shell remota mate sus procesos de trabajo, debe usarnohupel script en sí, no los procesos de trabajo individuales que crea.Como se explica aquí ,
nohupsolo 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 simplewaitentre los dosforbucles hará que el segundoforse ejecute solo después de que todos los procesos secundarios iniciados por el primeroforhayan salido.Con un simple
wait:Si necesita ejecutar el segundo
forsolo si no hubo errores en el primero, deberá guardar cada PID de trabajador$!y pasarlos await:fuente
Rocc1plusen eltopcomandowaithacebashque espere los trabajos en segundo plano que generó, nada más. Puede haber alguna confusión aquí: estosforbucles, ¿los guardó en un archivo e invocó como un script (lo que asumí, debido a la##scriptlínea), o los está escribiendo a mano en el terminal?Usa el
fgincorporado. Espera hasta que finalicen los procesos en segundo plano.Prueba
help fgpara más detalles.fuente
Si inserta algo como el siguiente segmento de código entre sus dos
forbucles, podría ayudar.Por supuesto, si su aplicación
Rscripttiene 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 --vanillase 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
topmuestra aRveces occ1plus.ps -eflista. O después de cadanohupcomando, registre el PID en una variable (preferiblemente una matriz)echo ${!}y compruebe este grupo de PID. Cuando todos desaparezcan, puede continuar con el segundoforciclo