Recrie uma ligação a um soquete unix com o arquivo vinculado removido

Recrie uma ligação a um soquete unix com o arquivo vinculado removido

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

  1. /var/lib/mysql/mysql.sock criado por um processo mysql no início

  2. /var/lib/mysql/mysql.sock desaparece, por exemplo, removido por alguma ação externa

  3. ss -lpn | grep mysqldainda mostra este soquete unix

    u_str LISTEN 0 128 /var/lib/mysql/mysqld.sock -786114905 * 0 users:(("mysqld",pid=30220,fd=41))

  4. lsof -p 30220 | grep /var/lib/mysql/mysqld.sockmostra que um processo está vinculado a ele

    mysqld 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/2de volta a um nome alternativo (no entanto, não será possível restaurá-lo para o mesmo nome).

informação relacionada