我已/var/log
挂载为 tmpfs,其中日志文件由 FreeBSD 上的 cron 定期同步到磁盘。该过程由脚本完成rc
。
我将其安装为:
mount -t tmpfs -o nosuid,noexec,mode=0755,size=100M log /var/log
现在的问题是 - 卸载它。它无法卸载,因为(r)syslog
写入文件。 lsof 显示了这一点:
lsof /var/log/
lsof: WARNING: compiled for FreeBSD release 11.1-RELEASE-p6; this is 11.1-RELEASE.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 85515 root 2w VREG 255,2264924190 210 13 /var/log/security
rsyslogd 85515 root 4w VREG 255,2264924190 210 3 /var/log/auth.log
rsyslogd 85515 root 5w VREG 255,2264924190 2292 7 /var/log/kern.notice
rsyslogd 85515 root 6w VREG 255,2264924190 2292 11 /var/log/messages
rsyslogd 85515 root 7w VREG 255,2264924190 2292 5 /var/log/debug.log
因此,为了卸载它,首先我必须停止 syslog 守护进程。但是,我正在寻找一些更好的解决方案,因为此操作是由 sh rc 脚本本身管理的。
在 Linux/GNU Os 上umount
有一个非常方便的论点:
--lazy detach the filesystem now, clean up things later
,据我所知,等待活动进程停止对文件系统的读写,并且然后卸载它的过程,这将导致成功并且不会破坏脚本。
因此,作为解决此问题的方法,如何停止 syslog 临时写入 /var/log ?我尝试过发出STOP
、尝试卸载并CONT
发出信号,但没有效果。
Lsof 仍然报告有 FD 可供写入。请注意,我需要可以从脚本应用的解决方案sh
。
谢谢!
编辑
umount 有--force
参数,在正常情况下我会不惜一切代价避免这种情况。但由于这是一个tmpfs
并且从内存而不是块设备运行,我相信它不会造成任何损害。
几次测试表明没有问题。我通过在 tmpfs 上创建虚拟文件dd
,检查它们的总和,将它们同步到硬盘,然后强制卸载来做到这一点。哈希值匹配,这意味着文件没有损坏。
嗯,这有点肮脏的解决方法,但我不知道其他解决方案。如果有人对 ram fs 上的此方法有一些缺点,请告诉我。
ps:感谢@layer8problem 的建议:-)