Аргументы 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' &