nohup múltiples comandos secuenciales

nohup múltiples comandos secuenciales

Necesito nohupdos comandos, uno tras otro. El segundo comando debe ejecutarse DESPUÉS del primer comando. Aquí están los comandos:

tar -zcf archive.tar.gz.tmp mydir
mv archive.tar.gz.tmp archive.tar.gz

Necesito que los comandos se ejecuten en segundo plano, pero obviamente no ambos al mismo tiempo. El segundo comando debe ejecutarse una vez completado el primer comando. Probé esto:

nohup tar -zcf archive.tar.gz.tmp mydir ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1 &

pero los comandos no se ejecutan en segundo plano. El indicador de bash espera hasta que se completen los dos comandos antes de darme otro mensaje. Necesito que se ejecuten en segundo plano.

Si lo hago:

nohup tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 &

Eso se ejecuta perfectamente en segundo plano. Es sólo cuando intento ejecutar más de un comando.

También probé:

nohup tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 & ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1 &

Pero eso tampoco funcionó. Sintaxis no válida o algo así. Estoy seguro de que hay una manera de hacer esto, pero no estoy seguro de la sintaxis.

La única alternativa que se me ocurre es poner los comandos en un .sharchivo y no actualizar ese archivo, pero eso no es necesariamente algo que pueda hacer en el sistema Linux en el que tengo que implementar esto (limitaciones de privilegios, etc.).

Respuesta1

Solución más sencilla: cree un script de shell con

 #/bin/sh
 tar -zcf archive.tar.gz.tmp mydir
 mv archive.tar.gz.tmp archive.tar.gz

Y use nohup myscript. Posiblemente con alguna documentación adicional en el script.

(Sí, soy un fanático de la documentación. Especialmente cuando trabajo con varias personas o cuando algún día podrías dejar el trabajo y tu sucesor necesita descubrir por qué".)


Una alternativa podría ser iniciar un nuevo shell para una subtarea (en este caso, tar y move)

nohup `$(tar -zcf archive.tar.gz.tmp midir; mv archive.tar.gz.tmp archive.tar.gz)


Alternativa 2:

nohup ```tar -zcf archive.tar.gz.tmp midir; mv archivo.tar.gz.tmp archivo.tar.gz```.

Aunque realmente prefiero el guión. Los comentarios que contiene pueden ser muy útiles cuando usted u otra persona vea el guión dentro de unos años y se pregunte por qué se hizo de esta manera.

En una nota no relacionada: ¿Cómo diablos publico una respuesta con un acento grave? (El comando para que un shell 'use este comando; envíe la salida a otro comando como entrada').

Respuesta2

Creo que necesitas paréntesis.

nohup $(tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz) >/dev/null 2>&1 &

Respuesta3

¿Quizás una envoltura de fiesta?

nohup bash -c 'tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1' &

Respuesta4

Puedes usar screenpara dar los comandos y desconectarte de la sesión de pantalla:

screen
tar -zcf archive.tar.gz.tmp mydir && mv archive.tar.gz.tmp archive.tar.gz
ctrl-a d to detach

Los comandos se ejecutarán como con nohup.

información relacionada