2

У меня есть программа на C++, которая работает как не демон (но может быть изменена), и я управляю ею с помощью systemd. Это работает. Хоть и с уродливым, что для его перезапуска мне нужно либо быть пользователем root (чтобы использовать перезапуск systemctl), либо kill -9 (так как он запускается как я). Я бегу Centos 6.

То, что я хотел бы сделать, когда программа перезапускается, это заархивировать и удалить файлы журнала. У меня работает архивирующая часть, но файлы журнала часто блокируются во время работы программы, и я не могу понять, как получить свой служебный файл:

  1. остановить программу
  2. архивировать файлы журнала
  3. запустить программу

Мой файл listener.service выглядит так:

[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

Независимо от того, использую ли я команды сна, команды RestartSec или оставляю их обоих, я получаю последовательность /var /log /messages, например, такую (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                        ***

Строки, отмеченные ***, выводятся из моей программы. Обратите внимание на временные метки журнала), и моя программа говорит, что он выключился, а затем сразу же перезапустился, а команды ExecStopPost и ExecStartPre выполняются только после запуска.

Я надеюсь, что есть что-то очевидное, что я здесь скучаю.

0