一旦 putty 终端关闭,nohup 中执行的命令就会被终止

一旦 putty 终端关闭,nohup 中执行的命令就会被终止

我有一个 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' &

相关内容