Аргументы nohup заканчиваются перед символом канала, потому что оболочка интерпретирует метасхемы как | и > до вызова команды.
Предоставленная командная строка направит стандартный вывод nohup (не mysqldump) на стандартный ввод gzip . Поэтому, когда вы выходите из системы, ваша оболочка и все дочерние процессы получают сигнал зависания. nohup предотвратит поступление сигнала на команду mysqldump , но команда gzip будет уничтожена, поскольку она все еще подключена к управляющему терминалу, который закрывается при выходе из сеанса.
Вы можете поместить свою команду в скрипт, как предлагает mnmnc, или вызвать новую оболочку для запуска всего конвейера:
nohup sh -c 'mysqldump -u user -ppass db | gzip > db.sql.gz' &
Здесь nohup вызовет одну команду, sh . Обратите внимание, что его стандартный вывод будет по умолчанию направлен в файл nohup.out , но мы не ожидаем никакого вывода от этой команды, так как перенаправляем стандартный вывод mysqldump .
Вновь порожденная оболочка вызовет конвейер команд mysqldump | gzip , перенаправляя стандартный вывод gzip в указанный файл.
Здесь вы можете увидеть разницу в вызываемых командах (используя dd вместо mysqldump для этих примеров):
$ 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 &
против
$ 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' &