Недавно я столкнулся с конкретной ситуацией, поиск в Интернете и спецификациях 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 без перезапуска родительского процесса, чтобы клиенты могли подключаться через этот файл сокета, как до удаления?
Спасибо.
Вы можете использовать старый трюк 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
вернуться к альтернативному имени (однако вы не сможете восстановить его с тем же именем).