redefinir automaticamente o sshfs quando ele travar, a remontagem falhará, a menos que seja feito manualmente

redefinir automaticamente o sshfs quando ele travar, a remontagem falhará, a menos que seja feito manualmente

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@serverEnquanto 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; echoo 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

informação relacionada