comando executado no nohup é cancelado assim que o terminal putty é fechado

1

Eu tenho uma instância do Amazon ubuntu ec2

Estou usando o PuTTY para acessar o mesmo.

Aqui, eu tenho um grande banco de dados no mysql. Estou executando o seguinte comando para fazer o backup do meu banco de dados.

nohup mysqldump -u username -ppassword mydatabase | gzip > mydatabase.sql.gz

Agora, quando eu saio do PuTTY, o comando não está mais sendo executado em segundo plano.

Eu também tentei rodar com &

ou seja, nohup mysqldump -u username -ppassword mydatabase | gzip > mydatabase.sql.gz &

Todos esses dias estava funcionando bem. Mas, de repente, está se comportando de maneira estranha.

Alguém pode me ajudar?

    
por Sughosh 11.02.2015 / 09:09

1 resposta

2

Os argumentos para nohup terminam antes do símbolo do pipe, porque o shell interpreta os metachars como | e > antes do comando ser chamado.

A linha de comando fornecida direcionará a saída padrão de nohup (não mysqldump ) para a entrada padrão de gzip . Portanto, quando você efetua logout, seu shell e qualquer processo filho recebe um sinal de desligamento. nohup impedirá que o sinal atinja o comando mysqldump , mas o comando gzip será eliminado porque ainda está conectado ao terminal de controle que está sendo fechado quando você sai da sua sessão.


Você pode colocar seu comando em um script como sugere o mnmnc ou invocar um novo shell para executar o pipeline inteiro:

nohup sh -c 'mysqldump -u user -ppass db | gzip > db.sql.gz' &

Aqui nohup chamará um único comando, sh . Observe que sua saída padrão será direcionada para o arquivo nohup.out por padrão, mas não esperamos nenhuma saída desse comando, já que redirecionamos a saída padrão de mysqldump .

O shell recém-gerado chamará o pipeline de comando mysqldump | gzip , redirecionando a saída padrão de gzip para o arquivo especificado.

Aqui você pode ver a diferença nos comandos invocados (usando dd em vez de mysqldump para esses exemplos):

$ nohup dd if=/dev/urandom bs=1M count=50 | gzip > /tmp/out.gz &
[1] 10721
nohup: ignoring input and redirecting stderr to stdout

$ jobs
[1]  10720 Running                 nohup dd if=/dev/urandom bs=1M count=50
     10721                       | gzip > /tmp/out.gz &

vs.

$ nohup sh -c 'dd if=/dev/urandom bs=1M count=50 | gzip > /tmp/out.gz' &
[1] 10792
nohup: ignoring input and appending output to ‘nohup.out’

$ jobs
[1]  10792 Running                 nohup sh -c 'dd if=/dev/urandom bs=1M count=50 | gzip > /tmp/out.gz' &
    
por 11.02.2015 / 17:43