Lógica dinâmica no arquivo de serviço systemd

2

Estou tentando reescrever um arquivo de serviço init.d que contém o seguinte código:

    if [ ! -r /var/spool/torque/server_priv/serverdb ]; then
            DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"
    fi
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_SERVER_OPTS

Eu reescrevi isso da seguinte forma:

[Service]
Type=forking
ExecStart=/usr/sbin/pbs_server
PIDFile=/var/spool/torque/server_priv/server.lock

Mas não tenho ideia de como representar o if no systemd.

    
por Let_Me_Be 18.08.2015 / 15:22

3 respostas

2

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.

    
por 20.08.2015 / 21:14
2

Você não vai gostar disso, mas funciona:

ExecStart=/bin/bash -c '\
    if [ ! -r /var/spool/torque/server_priv/serverdb ]; then \
            DAEMON_SERVER_OPTS="-t create $DAEMON_SERVER_OPTS"; \
    fi; \
    exec /usr/sbin/pbs_server -- $DAEMON_SERVER_OPT'
    
por 18.08.2015 / 20:21
0

Não existe tal facilidade no systemd - porque esse tipo de lógica realmente pertence ao daemon. No entanto, se você não puder alterar o daemon em questão, pode solucioná-lo criando primeiro a unidade simples, que verificará a existência do arquivo e criará a variável de ambiente correspondente e adicionará "EnvironmentFile=" à sua unidade. Também adicione dependência para garantir que sua unidade seja sempre executada após aquela que cria variáveis de ambiente.

    
por 18.08.2015 / 16:28