![Unison 文件同步器的正常关闭](https://linux22.com/image/790749/Unison%20%E6%96%87%E4%BB%B6%E5%90%8C%E6%AD%A5%E5%99%A8%E7%9A%84%E6%AD%A3%E5%B8%B8%E5%85%B3%E9%97%AD.png)
我们有一个在多个 Linux 和 Darwin (Macintosh) 系统上每晚运行的进程,用于备份文件系统对象。我们还使用 -repeat=watch 选项运行 unity 文件同步,以便同步尽可能保持最新状态。
我们的目标是优雅地在备份窗口之前关闭 unison 进程,然后在之后重新启动它们。目前,我们在kill -SIGTERM
启动每个同步进程的系统上使用相对不太优雅的方法。虽然这种方法有效,但并不理想,我希望有一种有序的方法来做到这一点,我可能错过了。(例如,必须仔细阅读文档才能发现 SIGUSR1 可用于关闭日志文件,因此我希望同样有另一个 SIG* 可用于此目的。
将其纳入我们的系统关闭流程也将会很好。
目前可以做到这一点吗(MAC 版本是“unison 版本 2.53.3(ocaml 4.14.0)”;unix(UBUNTU)版本是“unison 版本 2.48.4”。)如果没有优雅的方式,我会提出功能请求。
答案1
根据工会手册,礼貌停止观看信号是SIGUSR2。
6.10 中断同步
不连续同步时,文本界面会在同步正常完成或发生致命错误时终止。在文本界面中,要在同步完成之前中断同步,请按“Ctrl-C”(或发送信号 SIGINT 或 SIGTERM)。这将尽快中断更新传播,但仍能完成正确的清理。如果按下“Ctrl-C”后进程仍未停止,请继续重复执行此操作。这将绕过清理过程并强制终止进程(类似于 SIGKILL)。这样做可能会使存档或副本处于不一致状态或被锁定。连续同步时(时间间隔重复或使用文件系统监视),使用“Ctrl-C”或信号 SIGINT 或 SIGTERM 中断的工作方式与上述相同,并且还会停止连续进程。要仅停止连续进程并让最后一次同步正常完成,请发送信号 SIGUSR2。
它有一个 SIGTERM 处理程序,可以正常退出。一般来说,对于与文件相关的工具,清理意味着删除尚未完成复制的临时文件,并解锁所有资源。
实现并测试一个脚本,该脚本发送 SIGUSR2,等待一段时间,如果仍在运行,则发送 SIGTERM。例如,如果在 Linux 服务上使用 systemd,ExecStop 脚本可以发送此信号,等待一段时间,然后检查同步状态。然后,服务管理器发出的常规 TERM 信号将确保它关闭。确认您的文件集完好无损。同步程序崩溃一致并不一定意味着您的文件都处于同一时间点。
看来您有一个独立于同步过程的备份方法,这很好。
我认为仅像这样的同步不足以构成备份。好的备份是离线的、不可变的,并且是不同的媒体。如果意外或恶意软件将坏数据写入一侧,它将被同步到另一侧。而且同步冲突解决可能会带来复杂性,而不仅仅是从一棵树中创建一个存档。
独立的备份方式还可以确保您对文件同步过程的更改不会导致数据丢失。最坏的情况是,获取备份档案,安全地防止写入。