使用命令 & + 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"
)。
我今天尝试使用 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"
)。