我最近遇到了一个特殊情况,在网上和 Linux 规范中搜索都没有得到明确的答案。好吧,我认为这是不可能的,但也许你知道方法。
场景如下
/var/lib/mysql/mysql.sock 由 mysql 进程在启动时创建
/var/lib/mysql/mysql.sock 消失,例如被某些外部操作删除
ss -lpn | grep mysqld
仍然显示这个unix套接字u_str LISTEN 0 128 /var/lib/mysql/mysqld.sock -786114905 * 0 users:(("mysqld",pid=30220,fd=41))
lsof -p 30220 | grep /var/lib/mysql/mysqld.sock
显示某个进程与其绑定mysqld 30220 mysql 41u unix 0xffff8800245603c0 0t0 3508852391 /var/lib/mysql/mysqld.sock
是否可以在不重新启动父进程的情况下重新创建/恢复已删除的 unix 套接字文件,以便客户端仍然可以像删除之前一样通过此套接字文件进行连接?
谢谢。
答案1
您可以使用旧的 Unix 技巧来恢复仍打开但已被删除的文件。在这种情况下,您在那里完成了大部分工作:
ss -lpn | grep mysqld
u_str LISTEN 0 128 /var/lib/mysql/mysqld.sock -786114905 * 0 users:(("mysqld",pid=30220,fd=41))
检查 PID 为 30220 的打开的文件:
# ls -l /proc/30220/fd
lr-x------ 1 mysql mysql 64 janv. 15 19:04 0 -> /dev/null
l-wx------ 1 mysql mysql 64 janv. 15 19:04 1 -> /var/log/mysqld.log
lrwxrwxr-- 1 mysql mysql 64 janv. 15 19:04 2 -> /var/lib/mysql/mysqld.sock (deleted)
现在您可以将符号链接/proc/30220/fd/2
回备用名称(但是,您将无法将其恢复为相同的名称)。