Tenho um serviço que requer a montagem de uma montagem NFS, mas ele falha.
Criei um arquivo de montagem com escape systemd. O arquivo de montagem em si funciona, o ponto de montagem fica disponível após o start. Parece com isso:
[Unit]
After=network.target
[Mount]
Type=nfs
What=10.1.1.10:/opt/company/product-category/product-name/mnt
Where=/opt/company/product-category/product-name/mnt
Options=rw,user,exec
[Install]
WantedBy=multi-user.target
Eu adicionei RequiresMountFor=/opt/company/product-category/product-name/mnt
.
Até onde eu sei, isso deve ser o suficiente para meu serviço esperar pelo compartilhamento NFS. Meu programa requer que o NFS esteja disponível, ele tenta ler um arquivo lá e falha se não estiver disponível. Então, não tenho certeza do que está errado aqui. Meu palpite é que o NFS é muito lento e o systemd acha que o NFS está disponível.
Funciona se eu adicionar ExecStartPre=/usr/bin/sleep 3
ao meu serviço.
Você vê algum erro?
Você precisa (plural). Você não mencionou a qual unidade está adicionando isso, mas para ser claro, ele precisa ser adicionado à unidade de serviço, dentro da seção.
RequiresMountsFor=
[Unit]
Certifique-se de verificar
systemctl show -p After myservice
(e o mesmo comRequires
) – ambos devem mostrar sua unidade .mount na lista.(Você também pode escrever explicitamente
Requires=
+After=
no .service, com o nome da unidade .mount 'systemd-escaped' em vez do caminho.)O Systemd não "pensa" que o NFS está disponível com base no tempo. Ele sabe exatamente quais montagens foram estabelecidas, lendo de /proc/self/mountinfo – e, de fato, o systemd é o que chama o kernel para fazer essas montagens em primeiro lugar, então ele sabe quando a chamada de montagem retornou e com qual resultado.