![restablece automáticamente sshfs cuando se bloquea, el montaje falla a menos que se haga manualmente](https://rvso.com/image/192222/restablece%20autom%C3%A1ticamente%20sshfs%20cuando%20se%20bloquea%2C%20el%20montaje%20falla%20a%20menos%20que%20se%20haga%20manualmente.png)
Tengo 2 directorios locales en mi servidor montados en un servidor remoto. Local mantiene conexiones con
autossh -M 23 -R 24:localhost:22 user@server
Mientras que remoto se monta con dirs-sshfs.sh
sshfs -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,cache_timeout=3600 [email protected]:/mnt/localdir1/ /home/user/dir1/ -p 24
sshfs -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,cache_timeout=3600 [email protected]:/mnt/localdir2/ /home/user/dir2/ -p 24
Cuando se bloquea, sshfs-restart.sh se usa para restablecer la conexión
pkill -kill -f "sshfs"
fusermount -uz dir1
fusermount -uz dir2
./dirs-sshfs.sh
Todo funciona bien, pero tengo que 1) notar que se bloqueó y 2) restablecerlo manualmente.
Lo que hace que esto sea complicado es que cuando se bloquea, incluso ls del directorio de inicio se bloquea infinitamente hasta que se reinicia. Debido a esto, he renunciado a que esto se administre desde el lado del servidor remoto. En el lado de mi servidor local, donde se mantiene la conexión autossh, tengo el siguiente script que casi funciona. Esto detecta cuando falla e intenta restablecer la conexión, pero no se vuelve a montar después de desmontarlo. Intenté colocar el contenido de dirs-sshfs.sh dentro de ssh-restart.sh, e incluso el lado del servidor remoto run-sshfs-restart.sh que lo contenía ./sshfs-restart.sh &
no logró que funcionara. El script de prueba (testsshfs2.sh) contiene ls; echo; ls dir1; echo; ls dir2; echo; date; echo
el cual fue creado para ser una manera rápida y fácil de verificar si todo está montado/funcionando.
Este es sshfsmanager.sh, se ejecuta desde el servidor local dentro de un bucle while con un comando de suspensión. El futuro probablemente lo trasladará a un cronjob
sshout=$(timeout 300 ssh user@host ./testsshfs2.sh)
# timeout duration probably doesnt need to be that long, but sometimes it does take 90+ sec to ls
# the remote dirs as they are network shares mounted to a vm that are then mounted across a ssh
# tunnel. Once this is working, that duration would be fine tuned. Also 100 is just an arbitrary
# number larger than ls | wc -l would provide. It should be updated to where it would catch if
# either of the mounts fail instead of only when both do. This timeout method is the only way
# ive found to get around the infinite ls lock.
if [ `echo "$sshout" | wc -l` -le 100 ]; then
echo "$sshout" | wc -l
ssh user@host ./sshfs-restart.sh
#adding a "&& sleep 60" or using the run-sshfs-restart.sh script did not work
echo sshfs restarted
else
echo sshfs is fine
echo "$sshout" | wc -l
fi
La mayoría de los scripts tienen registros que se eliminaron cuando se colocaron aquí (además de cambiar puertos y eliminar usuario/host). La mayoría de las líneas de registro son solo fecha >> sshfsmanager.log
La VM local ejecuta ubuntu 18.04.5 y el servidor remoto es un VPS compartido que ejecuta gentoo 5.10.27