Às vezes, descobrir por que os mecanismos que devem funcionar não funcionam é mais trabalho do que apenas fazer o que você precisa para fazer outra maneira mais à prova de balas .
Você deseja montar uma pasta compartilhada durante a inicialização, mas obviamente é necessário aguardar até que a rede esteja ativa (observe que "rede" e "a rede está ativa" tendem a ser coisas muito diferentes dos serviços de inicialização do WRT). A maneira canônica de fazer isso é obviamente via ifup
ou um serviço de inicialização com dependência de um serviço que deveria estabelecer a conexão de rede (novamente, distinta de "rede"). Mas já decidimos que esses mecanismos não são confiáveis neste caso por qualquer motivo.
Para criar um método mais "à prova de balas", precisamos reduzir essa tarefa a seus elementos mais básicos e recorrer ao uso de ferramentas de shell para lidar com esses elementos de maneira básica e fundamental. Isso pode começar com algum tipo de teste para determinar se a rede está ativa e aguardando até que o teste seja bem-sucedido.
Ou podemos ignorar esse teste e testar o resultado de mount
, que falhará se o compartilhamento de rede estiver indisponível.
#!/bin/bash
exec &> /var/log/mountshare.log
gap=3
attempts=40
while [ $attempts -gt 0 ]; do
mount -v /foo /bar
if [ $? -eq 0 ]; then break; fi
attempts=$(($attempts - 1))
sleep $gap
done
Para explicar:
-
exec &> /var/log/mountshare.log
redireciona toda a saída desse script para um arquivo, sobrescrevendo qualquer versão anterior. Isso é um bashismo, e é por isso que a linha shebang não é simplesmente#!/bin/sh
. No entanto, usar o bash em um sistema linux normal é geralmente uma aposta segura. -
O valor de
gap
eattempts
significa que isso será tentado a cada três segundos por dois minutos - bastante tempo. Você poderia definir a diferença para um, se quiser. Esta é uma tarefa incrivelmente pequena que pode ser executada para sempre em intervalos de um segundo sem prejudicar o sistema. -
A linha
mount
é específica (obviamente você precisa personalizar isso). Como você sabe exatamente o que deseja fazer, é preferívelmount -a
e garante que nosso teste seja mais à prova de balas. Se você tiver uma listagem no fstab, poderá usar um argumento (o caminho do dispositivo ou outro identificador), mas, novamente, o uso de um comando específico e completo é fácil e satisfaz melhor os critérios à prova de balas . -
O teste,
if [ $? -eq 0 ]
, verifica o status de saída demount
. Quando é bem sucedido, retorna 0; quando falha, retorna algum outro valor. Observe que mount irá cuspir um erro nesse caso, e essa saída terminará no arquivo de log. Como usamos-v
, ele também produzirá uma mensagem quando a chamada for bem-sucedida. -
As próximas duas linhas diminuem o contador (
attempts
) e adicionam uma suspensão. O sono é muito importante. Não faça isso sem dormir. Sem isso, isso passa de uma "tarefa incrivelmente pequena que pode realmente durar para sempre" para algo que consumirá muito tempo do processador.
Para usar isso, coloque-o, por exemplo, /usr/local/bin
. Certifique-se de que seja de propriedade root.root ( sudo chown root:root mountmyshare.sh
) e executável ( chmod 755 mountmyshare.sh
). Você pode colocá-lo em qualquer lugar se não quiser em $PATH
, pois vamos usar um caminho absoluto e à prova de balas para invocá-lo de qualquer maneira.
Em seguida, na parte superior de /etc/rc.local
:
/usr/local/bin/mountmyshare.sh &
O &
é crítico; isso bifurca isso no fundo. Eu disse "colocar no topo" no caso de você ter outras coisas que podem estragar tudo. Isso não vai estragar nada.
Embora /etc/rc.local
seja uma espécie de mecanismo legado, ele ainda é executado no final da sequência de inicialização em todos os sistemas Linux razoavelmente normais, até onde eu saiba.