Рассмотрим следующий сценарий: Systemd Type = forking service запускает один сценарий оболочки, который, в свою очередь, запускает другой сценарий и завершается, что затем запускает фактический процесс службы / демона.
Теперь systemd будет считать, что служба запущена, как только завершится первый сценарий оболочки, и либо будет рассматривать второй сценарий оболочки как службу, либо искать файл PID, если он был упомянут в файле службы. Моя дилемма заключается в том, что первый сценарий завершается до того, как файл PID был создан вторым сценарием, а второй сценарий завершается примерно через полминуты, когда, наконец, запускается фактический процесс обслуживания.
Хотя теоретически я мог бы объединить эти связанные сценарии запуска, они поставляются вместе со службой, для которой я создаю служебный файл systemd, и я бы предпочел не смешиваться с этим, чтобы его можно было легко обновлять.
Итак, в основном вопрос: как мне обрабатывать связанные процессы разветвления в сервисе systemd, чтобы только последний разветвление в цепочке считалось / отслеживалось системой?
Для справки: программное обеспечение, вызывающее эту проблему, - это новейшая версия TeamCity, CI-сервера от JetBrains.
Насколько я знаю, людям StackExchange нравятся образцы кода, здесь мы идем с упрощенной бессмысленной версией: teamcity-server.service (файл службы Systemd):
[Unit]
Description=TeamCity server
After=network.target
[Service]
EnvironmentFile=/etc/conf.d/teamcity
ExecStart=/opt/teamcity/bin/teamcity-server.sh start
ExecStop=/opt/teamcity/bin/teamcity-server.sh stop
Type=forking
PIDFile=/opt/teamcity/logs/teamcity.pid
Restart=no
TimeoutSec=30
RemainAfterExit=yes
User=teamcity
[Install]
WantedBy=multi-user.target
teamcity-server.sh (это не настоящий сценарий, он просто показывает, как выполняется связанный сценарий):
#!/bin/sh
sh "script2.sh" "run" "$@" &
wait $!
EXIT_CODE=$?
exit $EXIT_CODE
script2.sh (это тоже не настоящий сценарий, просто показано, как мы запускаем здесь демон java):
#!/bin/sh
PIDFILE = "/opt/teamcity/logs/teamcity.pid"
java -jar somejavadaemon.jar
tc_pid=$?
echo $tc_pid > $PIDFILE