Dependência de serviço opcional do Systemd que verifica erros

1

Estou tentando reescrever um script de inicialização para o systemd, mas estou tendo dificuldades com um problema de dependências opcionais.

Meu serviço depende (opcionalmente) de outros dois serviços. Essas duas dependências são mutuamente exclusivas (pacote de servidor e cliente) - somente uma pode ser instalada por vez e pode estar ausente por completo.

Se uma das dependências estiver instalada, a dependência deverá ser iniciada antes do meu serviço e, se a inicialização falhar, meu serviço não deverá ser iniciado.

Mas se nenhuma das dependências estiver instalada, meu serviço deverá iniciar normalmente.

Como posso conseguir essa funcionalidade? As dependências opcionais são manipuladas por meio de Wants= , mas isso ignora os erros.

    
por Let_Me_Be 17.08.2015 / 13:32

2 respostas

1

Se você tiver controle sobre as dependências (ou seja, eles são o seu software), faça-os instalar um arquivo drop-in para o arquivo de unidade em questão. Ou seja, digamos que você tenha foo.service , que precisa depender de bar.service || baz.service .

Em seguida, o pacote bar pode instalar um arquivo /usr/lib/systemd/system/foo.service.d/50-bar-baz.conf com este conteúdo:

[Unit]
Requires=bar.service

Similarmente para baz package.

Se você não tiver controle sobre as dependências, basta criar um script "dispatcher" que verifica a existência dos arquivos da unidade e, em seguida, faz um exec systemctl start no arquivo de unidade escolhido. Em seguida, escreva uma unidade separada e solicite / após a unidade principal:

[Unit]
# inexistent unit names are ignored here
After=bar.service baz.service

[Service]
Type=oneshot
ExecStart=/path/to/dispatcher
    
por 20.08.2015 / 21:38
-1

Você pode usar as unidades de caminho systemd para isso. Seu arquivo de serviço deve ter uma unidade de caminho correspondente para verificar se o caminho / arquivo existe ou não.

Exemplo:

service.path
[Unit]
Description:Service description

[Path]
PathExists=!/other/service/binary/path/or/some/other/file/from/that/package

[Install]
WantedBy=some-user.target

Este só ativará seu serviço se o arquivo mencionado existir. Espero que minha compreensão da sua pergunta esteja correta e essa resposta ajude você.

    
por 17.08.2015 / 15:10