![Воссоздайте привязку к сокету unix с удаленным привязанным файлом](https://rvso.com/image/747350/%D0%92%D0%BE%D1%81%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%B9%D1%82%D0%B5%20%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D1%83%20%D0%BA%20%D1%81%D0%BE%D0%BA%D0%B5%D1%82%D1%83%20unix%20%D1%81%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%20%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC.png)
Недавно я столкнулся с конкретной ситуацией, поиск в интернете и спецификациях Linux не дал определенного ответа. Ну, я считаю, что это невозможно, но, возможно, вы знаете способ.
Сценарий следующий:
/var/lib/mysql/mysql.sock создается процессом mysql при запуске
/var/lib/mysql/mysql.sock исчезает, например, удален каким-то внешним действием
ss -lpn | grep mysqld
все еще показывает этот сокет unixu_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
на альтернативное имя (однако восстановить его под тем же именем вы не сможете).