Meu serviço atual e script de shell
Eu tenho um arquivo de serviço systemd chamado myservice.service
. O serviço é iniciado na inicialização. O serviço inicia o script de shell /usr/bin/myscript.sh
como você pode ver abaixo na seção [Service]
:
...
[Service]
Type=forking
ExecStart=/usr/bin/myscript.sh
PIDFile=/dev/shm/myscript.pid
...
O conteúdo do script é:
#!/bin/sh
/usr/bin/script-python.py > /dev/null &
echo $! > /dev/shm/myscript.pid
O script shell myscript.sh
inicia o script Python: script-python.py
. Pelo redirecionamento, > /dev/null
a saída padrão de script-python.py
é enviada para /dev/null
e, portanto, é perdida.
Alterações para usar Service->StandardOutput=null
Na documentação do systemd do StandardOutput li a seguinte frase:
null conecta a saída padrão a /dev/null, ou seja, tudo escrito nele será perdido.
Então estou pensando em executar as seguintes alterações nos meus arquivos:
myservice.service
torna-se (adicionarStandardOutput=null
):
...
[Service]
Type=forking
ExecStart=/usr/bin/myscript.sh
PIDFile=/dev/shm/myscript.pid
StandardOutput=null
...
myscript.sh
torna-se (remover>/dev/null
):
#!/bin/sh
/usr/bin/script-python.py &
echo $! > /dev/shm/myscript.pid
Minha pergunta
Minha pergunta é: se eu fizer as modificações mostradas acima o resultado é exatamente o mesmo da minha situação atual: todas as saídas de script-python.py
são perdidas? Não há nenhuma diferença?
Esses dois são quase equivalentes:
e
O primeiro redirecionará
stdout
do.py
script para/dev/null
. O segundo redirecionará do scriptstdout
inteiro para . Neste caso, eles são equivalentes, mas se seu script contivesse outras linhas, elas não seriam silenciadas (apenas ).sh
/dev/null
sh
script-python.py
Como mencionei nos comentários, seu script parece ter sido escrito para o antigo sistema SysV init. Ele funcionará bem com
systemd
withType=forking
, mas ele explicitamente faz coisas quesystemd
teriam sido feitas para você automaticamente.Se eu estivesse integrando isso em uma das minhas máquinas, eu excluiria
/usr/bin/myscript.sh
e usaria este arquivo de serviço:Você pode ver que isso é muito mais simples.
Desde que
script-python.py
não faça spam de stdout, eu provavelmente também apagaria aStandardOutput=
linha e deixariajournald
que ele cuidasse disso. Às vezes, vejo pessoas usando>/dev/null
porque executam manualmente o script de um terminal e querem reutilizar esse terminal para outras coisas sem serem incomodadas pelo stdout. Isso não é uma preocupação quando é um serviço.Aqui está uma explicação de cada linha alterada:
ExecStart=/usr/bin/script-python.py
: O Systemd pode executar o script python diretamente. Isso não era possível no SysV init. Isso evita invocarsh
. desnecessariamente.Type=forking
: Osh
script que você tinha originalmente, bifurcaria (&
), permitindoscript-python.py
a execução em segundo plano. É assim que os serviços costumavam funcionar. Como estamos executandoscript-python.py
diretamente, não precisamos disso. O padrãoType=simple
faz com que o systemd monitorescript-python.py
diretamente.PIDFile=
: Isso é usado apenas comType=forking
. É uma maneira de ajudarsystemd
a saber qual processo bifurcado ele deve rastrear como o processo primário.systemd
faz um bom palpite onde há apenas um processo filho, então ele provavelmente poderia ter sido excluído de qualquer maneira.Algumas outras notas:
Seu
PIDFile=
está em/dev/shm/
. Este é um lugar estranho para colocá-lo porque esse dispositivo geralmente é gerenciado por chamadas de memória compartilhada./run/script-python.pid
seria mais apropriado se você decidir manter isso.Os scripts init do sysV salvariam o PID em um arquivo para que ele pudesse ser recuperado mais tarde para parar/reiniciar. Com
systemd
o gerenciamento do seu serviço, isso é desnecessário, porque o PID é rastreado internamente, e os sinais de eliminação são definidos por outras opções.Então os usuários podem iniciar/parar o script com
Isso foi substituído por