Ejecutar múltiples comandos nohup en segundo plano

12

Tengo dos comandos cmd1 y cmd2. De los dos, cmd2 tarda más en terminar. Necesita ejecutar cmd2 y luego cmd1.

Intenté ejecutarlos de la siguiente manera:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

o

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

Pero en ambas ocasiones puedo ver que cmd1 no está esperando que cmd2 termine y se llene el resultado1.

¿Cómo hacer que cmd1 se ejecute después de cmd2 cuando ambos deberían ser nohup y ejecutarse en segundo plano?

usuario33767
fuente
Esta pregunta ya se hizo unix.stackexchange.com/questions/67006/…
Rahul Patil
2
La pregunta en unix.stackexchange.com/questions/67006/… es ligeramente diferente ya que quería mantener mi orden de ejecución. Corríjame si me equivoco al comprender la otra pregunta.
user33767

Respuestas:

12

Hiciste ambas cosas cmd1y cmd2corriste en paralelo. Usted dijo: “Comience cmd2 en segundo plano y corte cualquier asociación con él. Inicie cmd1 en segundo plano y corte cualquier asociación con él ". Querías decir: "Iniciar cmd2 en segundo plano; cuando esté completo, comience cmd1 (también en segundo plano) ". Como ya no hay ninguna asociación con la tarea en segundo plano, debe idear una tarea en segundo plano que realice cmd2 y luego cmd1. Esto es cmd2; cmd1(o mejor dicho, cmd2 && cmd1ejecutar cmd1 solo si cmd2 tiene éxito), y deberá indicar nohupque se inicie un shell en segundo plano para eso.

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &
Gilles 'SO- deja de ser malvado'
fuente
Gracias. Esta funcionando bien Sí, eso es lo que estaba pensando, después de hacer que el primer cmd pase al fondo, no afecta el segundo comando, que comienza a pesar de que quería que esperara a que terminara el primer comando. Necesito leer el manual sobre el envío de comandos a segundo plano.
user33767
3

Si no te importa no usar nohup:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown
artyom
fuente
Lo comprobaré. Pero actualmente irá con la respuesta de Giles, donde el comando está envuelto con sh. Gracias de todos modos
user33767
Esta es una mala idea. Cuando el usuario cierra la sesión de la consola, matará la sesión.
mootmoot
@mootmoot esto funciona según lo previsto, verifíquelo usted mismo; los comandos no recibirán SIGHUP cuando el shell principal salga.
artyom
Sí, es seguro para shell si ejecuta el comando usando crond / crontab. Pero no es seguro para pty / xterm / ssh. unix.stackexchange.com/questions/3886/…
mootmoot
2

Simplemente use:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &
Rahul Patil
fuente
Si bien ejecutar el comando múltiple está bien, quería mantener el orden exacto de ejecución, es decir, cmd2 primero y luego cmd1 y no sucede con el comando anterior. gracias
user33767
0

díganos qué está haciendo exactamente con cmd2 y cmd1. Depende del tipo de tarea y salida que desee de su comando. Si se enfrenta a un problema al presionar dos veces la tecla Intro con el comando, mi publicación puede resolverlo

puedes ir por este camino también

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

Vea la siguiente captura de pantalla, Aquí estoy usando 3 comandos y todos se ejecutan uno por uno en serie. Utilicé backticks para esta tarea. En la captura de pantalla también puede observar la marca de fecha y hora. el comando sleep tiene 60 segundos, por lo tanto, después de 60 segundos, mi siguiente comando se ejecuta con éxito. Utilicé el comando jobs para verificar si algún comando aún se ejecuta en segundo plano. Aquí no. de los trabajos que puede ver es 1.

nohup-multiple-command

Esta captura de pantalla también está disponible en este enlace , si no está visible

Sharad Chhetri
fuente