![redefinir automaticamente o sshfs quando ele travar, a remontagem falhará, a menos que seja feito manualmente](https://rvso.com/image/192222/redefinir%20automaticamente%20o%20sshfs%20quando%20ele%20travar%2C%20a%20remontagem%20falhar%C3%A1%2C%20a%20menos%20que%20seja%20feito%20manualmente.png)
eu tenho 2 diretórios locais no meu servidor montados em um servidor remoto. Local mantém conexões com
autossh -M 23 -R 24:localhost:22 user@server
Enquanto monta remotamente com 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
Quando ele trava, sshfs-restart.sh é usado para redefinir a conexão
pkill -kill -f "sshfs"
fusermount -uz dir1
fusermount -uz dir2
./dirs-sshfs.sh
Tudo funciona bem, mas preciso 1) notar que ele travou e 2) redefini-lo manualmente.
O que torna isso complicado é que, quando ele é bloqueado, até mesmo o ls do diretório inicial fica infinitamente bloqueado até ser reiniciado. Por causa disso, desisti de gerenciar isso do lado do servidor remoto. No lado do servidor local, onde a conexão autossh é mantida, tenho o seguinte script que quase funciona. Isso é detectado quando falha e tenta redefinir a conexão, mas não será remontado após a desmontagem. Tentei colocar o conteúdo dirs-sshfs.sh dentro de ssh-restart.sh, e até mesmo o lado do servidor remoto run-sshfs-restart.sh que continha ./sshfs-restart.sh &
não o fez funcionar. O script de teste (testsshfs2.sh) contém ls; echo; ls dir1; echo; ls dir2; echo; date; echo
o que foi criado para ser uma maneira rápida e fácil de verificar se tudo está montado/funcionando.
Este é sshfsmanager.sh, executado a partir do servidor local dentro de um loop while com um comando sleep. O futuro provavelmente irá movê-lo para um 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
A maioria dos scripts possui log que foi removido quando colocado aqui (além de alterar portas e remover usuário/host). Quase todas as linhas de registro são apenas data >> sshfsmanager.log
A VM local está executando o Ubuntu 18.04.5 e o servidor remoto é um VPS compartilhado executando o Gentoo 5.10.27