Я создал свои собственные init сценарии, которые используют переменные:
#! /bin/sh
case "$1" in
start)
echo "Starting Public API"
sudo -u techops sh ${JBOSS_HOME_PUBLIC_API}/bin/standalone.sh > ${PUBLICAPI_LOGGING_PATH} &
;;
stop)
echo "Stopping Public API"
sudo -u techops sh ${JBOSS_HOME_PUBLIC_API}/bin/jboss-cli.sh --connect --controller=localhost:$((9990 + $PUBLICAPI_PORT_OFFSET)) command=:shutdown > ${PUBLICAPI_LOGGING_PATH} &
;;
*)
echo "Usage: /etc/init.d/publicapi {start|stop}"
exit 1
;;
esac
exit 0
Переменные определяются в /etc/environment
и взгляды так:
PUBLICAPI_PORT_OFFSET=0
PUBLICAPI_LOGGING_PATH=/var/log/publicapi/publicapi.log
JBOSS_HOME_PUBLIC_API=/opt/publicapi
... и работа после входа в систему, когда я запускаю и останавливаю init сценарий вручную, но они не работали на запуск init сценарии (которые являются символьными ссылками на /etc/init.d/publicapi
в /etc/rc2.d/
, /etc/rc5.d/
, /etc/rc6.d/
). Запуск отказывает затем, потому что переменные неизвестны.
Я смог зафиксировать это путем выполнения systemctl edit publicapi
который создал файл /etc/systemd/system/publicapi.service.d/local.conf
который похож на это после того, как я отредактировал его:
[Unit]
Description=Public API startup script
Documentation=no documentation
[Service]
Environment="JBOSS_HOME_PUBLIC_API=/opt/publicapi"
Environment="PUBLICAPI_PORT_OFFSET=0"
Environment="PUBLICAPI_LOGGING_PATH=/var/log/publicapi/publicapi.log"
когда я перезагружаю, запуск init работ сценария. Но теперь у меня есть странная ситуация: Я всегда должен определять переменную оба в /etc/systemd/system/publicapi.service.d/local.conf
и в /etc/environment
. Если я опускаю тех от /etc/environment
, сценарии начальной загрузки init выполняются, но отказывает, потому что переменные, кажется, не установлены (по крайней мере, после входа в систему). если я комментирую переменные в /etc/systemd/system/publicapi.service.d/local.conf
и набор их в /etc/environment
только, переменные установлены после входа в систему, но сценарии начальной загрузки init не выполняются. Что продолжается здесь? Из чего объем /etc/systemd/system/publicapi.service.d/local.conf
(так как за значениями, очевидно, следуют вход в систему или возможно не набор)? Как я могу определить переменные только однажды глобально?
Я могу ответить на вопрос сам теперь. После траты половины дня с этим ремесленником гадят, у меня есть решение та работа. Нет никаких init сценариев больше в/etc/init.d/или/etc/rcX.d), или везде, где:
*) /etc/environment
JBOSS_HOME_CONSENT_SERVER=/opt/consent-server
CONSENT_SERVER_LOGGING_PATH=/var/log/consentserver/consent-server.log
CONSENT_SERVER_PORT_OFFSET=3000
*) в /home/techops
создайте сценарий consent-server
с этим содержанием:
#!/bin/sh
case "$1" in
start)
echo "Starting Consent Server"
sudo -u techops sh ${JBOSS_HOME_CONSENT_SERVER}/bin/standalone.sh > ${CONSENT_SERVER_LOGGING_PATH} &
;;
stop)
echo "Stopping Consent Server"
sudo -u techops sh ${JBOSS_HOME_CONSENT_SERVER}/bin/jboss-cli.sh --connect --controller=localhost:$((9990 + $CONSENT_SERVER_PORT_OFFSET)) command=:shutdown > ${CONSENT_SERVER_LOGGING_PATH} &
;;
*)
echo "Usage: systemctl {start|stop} consent-server or pass {start|stop} as parameter"
exit 1
;;
esac
exit 0
*), Создают файл /etc/systemd/system/consent-server.service
с этим содержанием:
[Unit]
Description=consent server startup script
[Service]
Type=oneshot
RemainAfterExit=yes
#if type=oneshot and RemainAfterExit=yes is not set, then the script stops immediately!
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/consent-server start
ExecStop=/home/techops/consent-server stop
[Install]
WantedBy=multi-user.target
*), Активируются, сервис (создаст символьную ссылку):
systemctl enable consent-server.service
После перезагрузки сервис запускается автоматически, и все переменные распознаны. Можно также запустить и остановиться, сервис с systemctl запускают сервер согласия systemctl сервер согласия остановки
Что продолжается, вот то, что Вы пишете System V init сценарий в системе, которая выполняет systemd.
Ваш systemd несколько назад совместим и будет запускать эти init скрипты старого стиля в своего рода эмуляции, но рассматривать их как systemd.
Я думаю, что у Вас будет лучшее время, отказываясь от Вашего старого init сценария и пишущий новый systemd сервис. Таким образом, Вам не нужно /etc/environment
.
Вот некоторые дополнительные материалы для чтения о том, как записать systemd сервисы.