Não há realmente um padrão construído de maneira que eu não pense, mas há algumas coisas que você pode aproveitar em systemd
.
Additional commands that are executed before [...] the command in ExecStart=, respectively. Syntax is the same as for ExecStart=, except that multiple command lines are allowed and the commands are executed one after the other, serially.
If any of those commands (not prefixed with "-") fail, the rest are not executed and the unit is considered failed.
Configures whether the service shall be restarted when the service process exits, is killed, or a timeout is reached.
If set to on-failure, the service will be restarted when the process exits with a non-zero exit code, is terminated by a signal (including on core dump, but excluding the aforementioned four signals), when an operation (such as service reload) times out, and when the configured watchdog timeout is triggered.
Os comandos são considerados com falha se retornarem códigos de saída diferentes de zero, portanto, definindo o ExecStartPre
como algo que comprove que sua interface está funcionando, você pode ter certeza de que seu serviço exigirá isso.
Alguns exemplos:
ExecStartPre=/usr/bin/ping -c 1 ${SAN_IP}
ExecStartPre=/usr/sbin/iscsiadm -m session
Pessoalmente, gosto da variante iscsiadm
do seu caso de uso. Se houver conexões iscsi, o valor de retorno será 0, caso contrário, retornará 21 (o que causaria a falha do serviço). A variante ping
pode funcionar para uma variedade maior de usos, mas eu diria que na maioria dos casos você pode querer encontrar um comando mais adequado para verificar o status da rede. Você pode até tentar usar ssh
se você tiver a configuração das chaves para verificar as coisas em outro host.
A questão é que ExecStartPre
pode permitir que você faça com que seu serviço falhe com base em qualquer comando. Apenas certifique-se de que qualquer comando que você usa retornará códigos de saída diferentes de zero quando você quiser (por exemplo, cat
ing um arquivo vazio retorna 0, enquanto cat
ing um arquivo inexistente retorna 1)
Depois de algumas considerações e do comentário do consulente, eu diria que a maneira melhor de definir uma condição complexa para um serviço é criar outro serviço para ele depender.
Crie um novo serviço que use o comando para verificar o status como ExecStart
. Dê-lhe o Restart=on-failure
. Em seguida, faça seu serviço original Require
e After
.
O exemplo de ExecStartPre
que usei acima está distorcendo sua finalidade original, que era configurar as coisas para o serviço ser executado corretamente. Ele ainda pode ser aplicado e o conhecimento ainda é útil, então estou deixando-o intacto.