我有一个 Amazon ubuntu ec2 实例
我正在使用 PuTTY 来访问相同的内容。
这里,我在 mysql 中有一个大型数据库。我正在执行以下命令来备份我的数据库。
nohup mysqldump -u 用户名 -p密码 mydatabase | gzip > mydatabase.sql.gz
现在,当我退出 PuTTY 时,该命令不再在后台运行。
我也尝试过用&运行
即 nohup mysqldump -u 用户名 -p密码 mydatabase | gzip > mydatabase.sql.gz &
这些天它一直运行良好。但是,突然间它的行为变得很奇怪。
谁能帮我?
答案1
要在管道符号之前终止的参数nohup
,因为 shell在调用命令之前会解释像|
和这样的元字符。>
提供的命令行将 nohup (不是mysqldump
)的标准输出定向到 的标准输入gzip
。因此,当您注销时,您的 shell 和任何子进程都会收到挂断信号。nohup
将阻止信号到达mysqldump
命令,但gzip
命令将被终止,因为它仍然连接到控制终端,而控制终端在您退出会话时将被关闭。
您可以按照 mnmnc 的建议将命令放入脚本中,或者调用新的 shell 来运行整个管道:
nohup sh -c 'mysqldump -u user -ppass db | gzip > db.sql.gz' &
这里nohup
将调用一个命令,sh
。请注意,它的标准输出将默认定向到文件nohup.out
,但我们不希望该命令有任何输出,因为我们重定向了的标准输出mysqldump
。
新生成的 shell 将调用命令管道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' &