Переменные в масштабе всей системы и для init сценариев и для системы?

Я создал свои собственные 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 (так как за значениями, очевидно, следуют вход в систему или возможно не набор)? Как я могу определить переменные только однажды глобально?

3
задан 16 January 2019 в 23:28

2 ответа

Я могу ответить на вопрос сам теперь. После траты половины дня с этим ремесленником гадят, у меня есть решение та работа. Нет никаких 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 сервер согласия остановки

1
ответ дан 1 December 2019 в 15:49

Что продолжается, вот то, что Вы пишете System V init сценарий в системе, которая выполняет systemd.

Ваш systemd несколько назад совместим и будет запускать эти init скрипты старого стиля в своего рода эмуляции, но рассматривать их как systemd.

Я думаю, что у Вас будет лучшее время, отказываясь от Вашего старого init сценария и пишущий новый systemd сервис. Таким образом, Вам не нужно /etc/environment.

Вот некоторые дополнительные материалы для чтения о том, как записать systemd сервисы.

3
ответ дан 1 December 2019 в 15:49

Другие вопросы по тегам:

Похожие вопросы: