команда, выполненная в nohup, уничтожается, как только терминал замазки закрывается

1350
Sughosh

У меня есть экземпляр 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
Напишите в скрипте все, кроме `nohup` и` & `, и вызовите скрипт с помощью` nohup` и `&`. Возможно, gzip завершает работу, когда вы закрываете Putty. Если полная команда в скрипте не удастся - дайте мне знать. mnmnc 9 лет назад 0

1 ответ на вопрос

2
zackse

Аргументы 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' & 
Большое спасибо, Зак. Сценарии оболочки работают. Любая идея о том, почему мой сценарий (без добавления оболочки) работал раньше, и вдруг он терпит неудачу. В любом случае, большое спасибо за ваше решение :) Sughosh 9 лет назад 0
Одна из возможностей заключается в том, что со временем база данных растет, и сначала mysqldump | конвейер gzip` закончен до выхода из оболочки. Позже, когда вы вышли, команда все еще работала, что привело к уничтожению gzip и получению mysqldump SIGPIPE. zackse 9 лет назад 0

Похожие вопросы