Estou tentando executar o calibre-server na inicialização. Aqui está um exemplo do conteúdo do serviço
[Unit]
Description=calibre Content server
After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/opt/calibre/calibre-server "/path-to-mounted-external-hdd-partition/Calibre Library"
[Install]
WantedBy=multi-user.target
Quando verifico o status do serviço:sudo systemctl status calibre-server.service
Recebo a seguinte mensagem:There is no calibre library at: /path-to-mounted-external-hdd-partition/Calibre Library
No entanto, quando digito: sudo systemctl start calibre-server.service
começa perfeitamente.
Minha suposição foi que a estrutura de partições e pastas não está montada/disponível no momento em que o serviço é executado inicialmente. Então tentei substituir ExecStart pelo ExecStart=/test.sh
conteúdo de test.sh
#!/bin/bash
ls -la /path-to-mounted-external-hdd-partition/ 2> /out.txt >> /out.txt
o resultado armazenado em out.txt mostra ( simplificado por questões de brevidade ):
.
..
parece que o conteúdo do disco rígido externo está vazio no momento em que o serviço é executado.
Por que é que? Como posso resolver isso?
PS Não sei se isso é importante, mas a montagem é feita via aplicativo ubuntu/disks e não por /etc/fstab
PPS
systemctl list-units | grep '\.mount'
-.mount loaded active mounted Root Mount
...
media-XXX-Storage.mount loaded active mounted /media/XXX/Storage
onde /media/XXX/Storage é exatamente o que descrevi como /path-to-mounted-external-hdd-partition
Se determinado caminho precisar ser montado antes de executar sua unidade de serviço, você também poderá adicionar a
RequiresMountsFor=
diretiva na[Unit]
seção. Isso verificará se o caminho está disponível. Portanto, no caso em questão, a diretiva completa seriaRequiresMountsFor="/path-to-mounted-external-hdd-partition
.Para obter mais informações sobre esta diretiva, verifique a documentação da unidade systemd .
Seu servidor calibre está iniciando antes de sua montagem estar pronta. Vamos adicionar a dependência de pedido adequada (EDIT, pule para minha segunda solução ou use a resposta de @noisefloor como uma versão mais limpa desta minha primeira solução):
Se isso não funcionar, você pode adicionar um loop no início para testar um arquivo dentro:
Esta resposta depende de uma suposição que fiz com base em suas edições e comentários.
A montagem que você está usando é uma montagem externa e você depende da funcionalidade de montagem automática do GNOME. Você não o configurou
fstab
nem como uma montagem do systemd. Essa suposição ocorre principalmente porque você mencionouls
no diretório que mostra um diretório vazio, e esse não deveria ser o caso. E o fato de o diretório estar em/media/XXX
.Unidades montadas automaticamente não estão disponíveis durante a inicialização. Você pode confirmar isso executando o comando da sua edição
systemctl list-units | grep '\.mount'
no seu teste em vez dols
comando. O resultado não mostrará o ponto de montagem. Portanto, adicioná-los como dependências não terá nenhum efeito, pois esses pontos de montagem são gerados automaticamente após você fazer login na sessão do usuário.Você pode tentar experimentar um serviço de usuário em vez de um serviço de sistema. Nesse caso, você poderá obter mais sucesso com a abordagem de loop de Daniel T.
Crie o serviço em
~/.config/systemd/user/your-service-name.service
e habilite-o ao passar--user
para osystemctl
comando.Caso contrário, a abordagem mais segura que recomendo é adicionar uma
fstab
entrada (ou uma entrada systemd .mount) para montar sua unidade. Então, como sugerem as outras respostas, você pode usá-lo paraRequires
ouRequiresMountsFor
.Sal. Isso não está diretamente relacionado à sua pergunta, mas se
ls -la /path-to-mounted-external-hdd-partition/
estiver mostrando um diretório vazio durante a inicialização e você espera que ele mostre o conteúdo do seu disco, é porque o diretório existe. Quando a unidade é montada, o caminho é substituído por um caminho local para a unidade montada.Você pode testar isso desconectando completamente a unidade e tentando o
ls
comando para ver se isso resulta emNo such file or directory
erro.