Como já foi dito, não há deliberadamente suporte para lógica complexa em systemd
. Se houver alguma lógica de inicialização a ser executada (e isso não fizer parte do próprio daemon), é completamente correto escrever um pequeno script de shell e especificá-lo em ExecStart=
.
Há uma coisa a considerar, no entanto. O script de shell não deve fazer qualquer gerenciamento de processo sozinho. O script de shell deve exec
do daemon. Isso é necessário para evitar a interferência com o monitoramento e o gerenciamento de processos do próprio systemd.
Um exemplo de um script de shell errado:
#!/bin/sh
if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
fi
$DAEMON -- $DAEMON_SERVER_OPTS
Isso torna o daemon um filho do interpretador de shell. Se o daemon não for bifurcado e o protocolo de preparação ( Type=
) for simple
, então é apenas um processo redundante por aí. Caso contrário, se o daemon forks e você definir Type=forking
, a coisa toda será triple-fork, não double-fork, e o systemd matará o daemon.
Um exemplo de um script de shell correto:
#!/bin/sh
if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
fi
exec $DAEMON -- $DAEMON_SERVER_OPTS
Isso substitui o processo do shell pelo daemon.