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