Аргументы nohup
заканчиваются перед символом канала, потому что оболочка интерпретирует метасхемы как |
и >
до вызова команды.
Предоставленная командная строка направит стандартный вывод nohup (not 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' &