如何在服务器后台运行指定rsync命令以实现夜间目录同步(关闭本地SSH终端仍可执行)
嘿,这个问题问得很实际!先给你明确答案:如果直接运行你给出的rsync -avhW --no-compress --progress folderA/. folderB/命令,关闭本地SSH终端后,这个rsync任务会被终止。原因是当你关闭SSH会话时,服务器上的rsync进程会收到一个SIGHUP(挂起)信号,默认情况下进程会响应这个信号并退出。
不过别担心,有好几种方法能让rsync在你关闭终端后继续在服务器后台运行,甚至还能满足你夜间自动执行的需求,下面给你逐一说明:
可行的解决方案
1. 用nohup让进程脱离终端控制
这是最轻量化的方法,它会让rsync忽略SIGHUP信号,同时把输出保存到日志文件里。
执行命令的格式如下:
nohup rsync -avhW --no-compress --progress folderA/. folderB/ &
nohup:核心作用就是让后续命令不受SSH会话关闭的影响&:把rsync进程放到后台运行,你还能在当前终端继续执行其他操作
关闭终端后,任务会在服务器后台继续跑。之后登录服务器时,你可以通过查看nohup.out文件来了解复制进度,比如用tail -f nohup.out实时查看输出。
2. 用终端复用工具(screen/tmux)持久化会话
如果你想后续还能重新查看rsync的实时进度,screen或tmux是更好的选择,它们能创建一个持久的终端会话,即使SSH断开,会话依然在服务器上运行。
以screen为例:
- 登录服务器后,输入
screen创建一个新的会话窗口 - 在这个新窗口里运行你的rsync命令
- 按下
Ctrl+A再按D,把当前会话“脱离”(回到原来的终端) - 现在你可以放心关闭SSH终端了,rsync会在后台的screen会话里继续运行
- 下次登录服务器,输入
screen -r就能重新连接到之前的会话,查看rsync的实时进度
tmux的操作逻辑类似:用tmux new -s rsync_task创建会话,Ctrl+B再按D脱离,tmux attach -t rsync_task重新连接。
3. 用cron设置定时任务(完美匹配夜间执行需求)
既然你想在夜间时段自动执行复制任务,直接用服务器的定时任务工具cron最省心——它会在指定时间自动后台运行任务,完全不需要你手动触发。
操作步骤:
- 登录服务器后,输入
crontab -e打开定时任务编辑器 - 添加一行类似下面的配置(比如设置每天凌晨2点执行):
0 2 * * * rsync -avhW --no-compress folderA/. folderB/ > /var/log/rsync_backup.log 2>&1
0 2 * * *:这是cron的时间格式,代表“每天凌晨2点整”(格式顺序:分 时 日 月 周)- 把命令的输出重定向到
/var/log/rsync_backup.log,方便后续查看执行结果和日志(这里去掉了--progress,因为cron运行的任务没有交互终端,进度条输出没有实际意义,换成日志记录更实用)
关于你原命令的小补充
你给出的rsync参数非常适合本地目录复制:
-a:归档模式,会保留文件的权限、时间戳、软链接等所有属性-v:输出详细的操作日志-h:用人类可读的格式显示文件大小(比如MB/GB)-W:整文件复制,跳过rsync默认的增量检查——因为是同一服务器内的复制,增量检查反而会浪费CPU资源,这个参数能提升复制速度--no-compress:本地复制不需要压缩,避免不必要的CPU消耗
内容的提问来源于stack exchange,提问作者Gonzalo




