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