Estou depurando um firewall .service unit e surgem algumas dúvidas.
Uma dessas questões é o melhor tipo de serviço da unidade, seja exec ou oneshot. Praticamente nenhuma comparação dos dois aparece em minhas pesquisas, provavelmente porque exec é uma adição relativamente recente ao systemd (v.249 IIRC).
Como pano de fundo, a unidade (chamada de iptables.service) destina-se a ativar e configurar o firewall executando um script Bash (chamado de iptables.sh) antes que a rede esteja ativa ( ou seja , antes de network-pre.target), por exemplo ,
ExecStart=/bin/bash -c '/home/locsh/iptables.sh'
Type=oneshot tem a vantagem de não entrar no estado "ativo", podendo ser reiniciado ou reativado posteriormente, por exemplo , por uma unidade de timer. Também é o mais comum dos dois tipos na maioria dos exemplos, embora sem explicação.
Type=exec tem a vantagem de atrasar a inicialização das unidades de acompanhamento até que o serviço principal seja executado. Isso parece fazer todo o sentido para uma unidade .service de firewall porque a rede deve depender do script sendo executado com sucesso e permanecer inativa caso contrário, por exemplo , se o script temporariamente não puder ser lido porque de alguma forma a unidade .mount relevante ainda não foi ativada .
Restart=on-failure parece ser uma adição óbvia e prudente em ambos os casos.
A primeira questão é se um ou outro pode ser melhor por qualquer motivo.
A segunda questão é se Type=exec, porque atrasa o início das unidades de acompanhamento, pode introduzir um ciclo de ordenação sutil em alguns casos extremos, com ou sem "Restart=on-failure", em parte porque a dependência de ordenação da unidade
Before=network-pre.target
é relativamente cedo no processo de inicialização.
Você quer
type=oneshot
. Se você usartype=exec
, outros serviços poderão ser iniciados antes que o firewall seja configurado. Nasystemd.service
página man, paraexec
:E para
oneshot
:Em outras palavras, com
Type=exec
,systemd
considera o serviço como "ativo" quando o processo é iniciado com sucesso , enquanto paraType=oneshot
,systemd
considera o serviço como "ativo" quando o processo é concluído com êxito .