disown是更好的做法(内置在shell而不是依赖于外部工具),但它需要更多的工作:你需要自己重定向stdin,stdout和stderr(而如果你没有' nohup,将使用nohup.out硬编码的名称进行重定向'自己动手).
从而:
rsync "${args[@]}" </dev/null >logfile 2>&1 & disown -h "$!"
Run Code Online (Sandbox Code Playgroud)
作为一个文体的注意,如果你做出PID的唯一用途是将它传递给disown,我不建议把disown在同一行调用,如上面做了:这可确保$!引用的是后台进程分叉之前立即,即使将来的更改在rsync启动后添加更多代码,可能会分支其他后台进程.(另一方面,如果您想稍后引用PID,可以在同一行上放置一个变量赋值:rsync ... & rsync_pid=$!,然后disown -h "$rsync_pid"在另一行上).