1

У меня есть экземпляр Amazon Ubuntu EC2

Я использую PuTTY для доступа к тому же.

Здесь у меня есть большая база данных в MySQL. Я выполняю следующую команду, чтобы сделать резервную копию моей базы данных.

nohup mysqldump -u имя пользователя -ppassword mydatabase | gzip> mydatabase.sql.gz

Теперь, когда я выхожу из PuTTY, команда больше не работает в фоновом режиме.

Я также пробовал работать с &

т.е. nohup mysqldump -u имя пользователя -ppassword mydatabase | gzip> mydatabase.sql.gz &

Все эти дни все работало нормально. Но вдруг он ведет себя странно.

Может кто-нибудь мне помочь?

1 ответ1

2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .