我今天尝试使用
nohup
命令来执行一个rsync
命令,以便在关闭控制台后从VM复制一些文件到另一个位置。然后我想为什么不使用rsync [parameters] &
+disown %1
呢?这两种方式有什么区别?disown
是更好的做法(因为它是 shell 内置命令,而不是依赖于外部工具),但需要更多的工作:您需要自己重定向标准输入、标准输出和标准错误输出(而 nohup
会在缺少重定向的情况下使用硬编码的 nohup.out
文件名进行重定向)。
因此:
rsync "${args[@]}" </dev/null >logfile 2>&1 & disown -h "$!"
作为一种风格上的注意,如果您唯一使用PID是将其传递给disown
,我建议将disown
放在与调用相同的行上,如上所示:这样可以确保$!
引用是在rsync
启动之后立即分叉的后台进程,即使未来的更改添加了更多代码,在rsync
启动之后可能会分叉其他后台进程。(另一方面,如果您想稍后引用PID,则可以在同一行上放置变量赋值:rsync ... & rsync_pid=$!
,然后在单独的行上放置disown -h "$rsync_pid"
)。