误用 rm 删除日志文件而非清空内容(> /var/log/syslog),文件实体仍在磁盘,只要日志守护进程(rsyslogd/syslogd)仍持有文件描述符,即可通过 /proc/PID/fd/ 恢复。本文以 Ubuntu 为例演示恢复全过程。
sudo lsof | grep /var/log/syslog
# 或
sudo lsof | grep messages
# 输出示例:
# rsyslogd 544 root 7w REG 8,1 214641 134422 /var/log/messages
# PID=544, FD=7
# 确认 /proc/544/fd/7 指向被删文件
ls -l /proc/544/fd/7
# 输出:lrwx------ 1 root root 64 ... 7 -> /var/log/messages (deleted)
# 复制恢复
sudo cp /proc/544/fd/7 /var/log/messages
# 或重定向
sudo cat /proc/544/fd/7 > /var/log/messages
# 查看服务名
service --status-all | grep -E 'syslog|rsyslog'
# 重启
sudo service rsyslog restart
# 或
sudo systemctl restart rsyslog
# 截断文件大小为 0,保留 inode 与文件描述符
sudo truncate -s 0 /var/log/syslog
# 或
sudo sh -c ': > /var/log/syslog'
# 或
sudo dd if=/dev/null of=/var/log/syslog
unlink)仅移除目录项,引用计数归零且无打开文件描述符时才真正释放磁盘块。rsyslogd 启动时以 O_APPEND 打开日志文件,持有描述符直到重启或收到重载信号。/proc/PID/fd/N 是内核暴露的文件描述符符号链接,读取即可获取文件当前内容。
误删日志文件后,只要守护进程未重启,即可通过 /proc/PID/fd/ 完美恢复,随后重启服务即可继续正常记录。养成用 truncate 或重定向清空日志的习惯,避免此类事故。