使用命令 & + disown 而不是 nohup

Using command & + disown instead of nohup

我今天尝试使用 nohup 命令执行 rsync 命令,以便即使我关闭了控制台也能处理一些文件从 VM 到另一个 VM 的副本。

那我说为什么不用rsync [参数] <b>&</b> + disown %1

两者有什么区别?

disown 是更好的做法(内置于 shell 而不是依赖于外部工具),但它需要更多的工作:您需要自己重定向 stdin、stdout 和 stderr (而 nohup 将使用硬编码的 nohup.out 名称进行重定向,如果您自己没有这样做的话)。

因此:

rsync "${args[@]}" </dev/null >logfile 2>&1 & disown -h "$!"

作为风格说明,如果您对 PID 的唯一用途是将其传递给 disown,我 do 建议将 disown 与调用在同一行,如上所示:这确保了 $! 引用是对之前分叉的后台进程,即使未来的更改添加了更多代码,可能会分叉其他后台进程,之后rsync 已启动。 (另一方面,如果你想稍后引用 PID,你可以在同一行上放置一个变量赋值:rsync ... & rsync_pid=$!,然后在单独的一行上放置 disown -h "$rsync_pid")。