nohup vários comandos sequenciais

nohup vários comandos sequenciais

Preciso de nohupdois comandos, um após o outro. O segundo comando deve ser executado APÓS o primeiro comando. Aqui estão os comandos:

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

Preciso que os comandos sejam executados em segundo plano, mas obviamente não os dois ao mesmo tempo. O segundo comando deve ser executado após a conclusão do primeiro comando. Eu tentei isso:

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

mas os comandos não são executados em segundo plano. O prompt do bash espera até que os dois comandos sejam concluídos antes de me fornecer outro prompt. Eu preciso que eles sejam executados em segundo plano.

Se eu fizer:

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

Isso funciona perfeitamente em segundo plano. É só quando tento fazer mais de um comando.

Eu também tentei:

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

Mas isso também não funcionou. Sintaxe inválida ou algo assim. Tenho certeza de que existe uma maneira de fazer isso, mas não tenho certeza da sintaxe.

A única alternativa que consigo pensar é colocar os comandos em um .sharquivo e nohup desse arquivo, mas isso não é necessariamente algo que eu possa fazer no sistema Linux em que tenho que implementar isso (limitações de privilégios, etc.).

Responder1

Solução mais fácil: crie um script de shell com

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

E use nohup myscript. Possivelmente com alguma documentação extra no script.

(Sim, adoro documentação. Especialmente quando trabalho com várias pessoas ou quando algum dia você pode deixar o emprego e seu sucessor precisa descobrir o porquê.)


Uma alternativa pode ser iniciar um novo shell para uma subtarefa (neste caso, seu tar e move)

nohup `$(tar -zcf arquivo.tar.gz.tmp meudir; mv arquivo.tar.gz.tmp arquivo.tar.gz)


Alternativa 2:

nohup ```tar -zcf archive.tar.gz.tmp meudir ; mv arquivo.tar.gz.tmp arquivo.tar.gz```.

Eu realmente prefiro o roteiro. Os comentários nele contidos podem ser bastante úteis quando você ou outra pessoa olhar o roteiro daqui a alguns anos e se perguntar por que foi feito dessa maneira.

Em uma nota não relacionada: como diabos faço para postar uma resposta com um crase? (O comando para um shell 'usar este comando; alimentar a saída para outro comando como entrada').

Responder2

Acho que você precisa de parênteses.

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

Responder3

Talvez um envoltório de festa?

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' &

Responder4

Você pode usar screenpara dar os comandos e se desconectar da sessão da tela:

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

Os comandos serão executados como nohup.

informação relacionada