Eu tenho um programa em C ++ que é executado como não-daemon (mas poderia ser alterado), e estou controlando-o com o systemd. Isso funciona. Embora com o feio que para reiniciá-lo eu preciso ser root (para usar o systemctl restart) ou kill -9 (já que ele é executado como eu). Eu estou correndo Centos 6.
O que eu gostaria de fazer quando o programa for reiniciado é zip up e remover os arquivos de log. Eu tenho a parte de compactação funcionando, mas os arquivos de log geralmente são bloqueados enquanto o programa é executado, e não consigo descobrir como obter meu arquivo de serviço:
Meu arquivo listener.service é assim:
[Unit]
Description=Listener - main Digiflex server program
# start only once the network subsystems are available
After=network.target
[Service]
Type=simple
# ExecStartPre commands are executed in order given
ExecStartPre=-/usr/bin/echo "ExecStartPre first"
ExecStartPre=-/usr/bin/bash -c "/usr/bin/zip -D -9 -x*.zip -x*.sql -x*.gz /code/logs/%H-$(TZ=Australia/Sydney date +%Y-%%m-%d__%%H.%M.%S ).zip /code/logs/*"
#ExecStartPre=-/usr/bin/echo "ExecStartPre before sleep"
#ExecStartPre=-/usr/bin/sleep 1
ExecStartPre=-/usr/bin/echo "ExecStartPre last"
ExecStart=/code/listener
ExecStartPost=-/usr/bin/echo "ExecStartPost"
#ExecStopPost=-/usr/bin/echo "ExecStopPost before sleep"
#ExecStopPost=-/usr/bin/sleep 1
ExecStopPost=-/usr/bin/echo "ExecStopPost"
# keep alive - always restart it if it dies
Restart=always
# wait 5 seconds between restarts
RestartSec=5
# wait 5s for start and stop
TimeoutSec=10
[Install]
WantedBy=multi-user.target
Se eu usar os comandos sleep, os comandos RestartSec ou deixar ambos fora, recebo uma sequência / var / log / messages como esta (sudo grep listener -b5 -a5 / var / log / messages):
270521-Sep 1 06:24:16 dfxmyalarmsqlb1 systemd: Reloading.
270715-Sep 1 06:24:16 dfxmyalarmsqlb1 systemd: Stopping Listener - main Digiflex server program...
270808:Sep 1 06:24:16 dfxmyalarmsqlb1 listener: stopping...!
270809:Sep 1 06:24:16 dfxmyalarmsqlb1 listener: Listener shut down complete build date 20150901 commit 1,474 ***
270924:Sep 1 06:24:16 dfxmyalarmsqlb1 listener: Listener starting: build date 20150901 commit 1,474 ***
271018-Sep 1 06:24:16 dfxmyalarmsqlb1 echo: ExecStopPost before sleep
271082-Sep 1 06:24:17 dfxmyalarmsqlb1 echo: ExecStopPost
271133-Sep 1 06:24:17 dfxmyalarmsqlb1 systemd: Starting Listener - main Digiflex server program...
271226-Sep 1 06:24:17 dfxmyalarmsqlb1 echo: ExecStartPre first
271283:Sep 1 06:24:17 dfxmyalarmsqlb1 bash: adding: code/logs/listener-app-forwarded-errors.log (stored 0%)
271385:Sep 1 06:24:17 dfxmyalarmsqlb1 bash: adding: code/logs/listener-errors.log (deflated 93%)
271476:Sep 1 06:24:17 dfxmyalarmsqlb1 bash: adding: code/logs/listener.log (deflated 94%)
271560:Sep 1 06:24:17 dfxmyalarmsqlb1 bash: adding: code/logs/listener-packets.log (deflated 97%)
271652:Sep 1 06:24:17 dfxmyalarmsqlb1 bash: adding: code/logs/listener-quickfail.log (stored 0%)
271743:Sep 1 06:24:17 dfxmyalarmsqlb1 bash: adding: code/logs/listener-skinny-polls.log (stored 0%)
271837:Sep 1 06:24:17 dfxmyalarmsqlb1 bash: adding: code/logs/listener-zero-sesson.log (stored 0%)
271930-Sep 1 06:24:17 dfxmyalarmsqlb1 echo: ExecStartPre before sleep
271994-Sep 1 06:24:18 dfxmyalarmsqlb1 echo: ExecStartPre last
272050-Sep 1 06:24:18 dfxmyalarmsqlb1 echo: ExecStartPost
272102-Sep 1 06:24:18 dfxmyalarmsqlb1 systemd: Started Listener - main Digiflex server program.
272192:Sep 1 06:24:18 dfxmyalarmsqlb1 listener: logfile config from /code/listener.zlog.conf ***
Linhas marcadas com *** saem do meu programa. Observe os registros de data e hora do log) e meu programa diz que ele foi desligado e reiniciado imediatamente, com os comandos ExecStopPost e ExecStartPre ocorrendo apenas após a inicialização.
Espero que haja algo óbvio que sinto falta aqui.