Recrear un enlace a un socket Unix con el archivo enlazado eliminado

Recrear un enlace a un socket Unix con el archivo enlazado eliminado

Recientemente me enfrenté a una situación específica; la búsqueda en Internet y las especificaciones de Linux no dieron una respuesta definitiva. Bueno, creo que no es posible pero tal vez conozcas el camino.

El escenario es el siguiente

  1. /var/lib/mysql/mysql.sock creado por un proceso mysql al inicio

  2. /var/lib/mysql/mysql.sock desaparece, por ejemplo, eliminado por alguna acción externa

  3. ss -lpn | grep mysqldtodavía muestra este socket 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.sockmuestra que un proceso está ligado a él

    mysqld 30220 mysql 41u unix 0xffff8800245603c0 0t0 3508852391 /var/lib/mysql/mysqld.sock

¿Es posible recrear/restaurar el archivo de socket Unix eliminado sin reiniciar el proceso principal para que los clientes aún puedan conectarse a través de este archivo de socket como antes de la eliminación?

Gracias.

Respuesta1

Puede utilizar el antiguo truco de Unix para recuperar un archivo aún abierto pero eliminado. En ese caso, hiciste la mayor parte del trabajo allí:

ss -lpn | grep mysqld 

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

Consulta los archivos abiertos del PID, aquí, 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)

Ahora puede /proc/30220/fd/2volver a establecer un enlace simbólico con un nombre alternativo (sin embargo, no podrá restaurarlo con el mismo nombre).

información relacionada