![Recrie uma ligação a um soquete unix com o arquivo vinculado removido](https://rvso.com/image/747350/Recrie%20uma%20liga%C3%A7%C3%A3o%20a%20um%20soquete%20unix%20com%20o%20arquivo%20vinculado%20removido.png)
Fui confrontado com uma situação específica recentemente, pesquisar na internet e nas especificações do Linux não deu uma resposta definitiva. Bom, acredito que não seja possível mas talvez você conheça o caminho.
O cenário é o seguinte
/var/lib/mysql/mysql.sock criado por um processo mysql no início
/var/lib/mysql/mysql.sock desaparece, por exemplo, removido por alguma ação externa
ss -lpn | grep mysqld
ainda mostra este soquete 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
mostra que um processo está vinculado a elemysqld 30220 mysql 41u unix 0xffff8800245603c0 0t0 3508852391 /var/lib/mysql/mysqld.sock
É possível recriar/restaurar o arquivo de soquete unix excluído sem a reinicialização do processo pai, para que os clientes ainda possam se conectar por meio desse arquivo de soquete como antes da exclusão?
Obrigado.
Responder1
Você pode usar o antigo truque do Unix para recuperar um arquivo ainda aberto, mas excluído. Nesse caso, você fez a maior parte do trabalho lá:
ss -lpn | grep mysqld
u_str LISTEN 0 128 /var/lib/mysql/mysqld.sock -786114905 * 0 users:(("mysqld",pid=30220,fd=41))
Confira os arquivos abertos do PID, aqui, 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)
Agora você pode vincular /proc/30220/fd/2
de volta a um nome alternativo (no entanto, não será possível restaurá-lo para o mesmo nome).