Как исправить переменные среды, не работающие при запуске из службы system-d в Go - PullRequest
0 голосов
/ 31 января 2019

Я использую os.Getenv("APP_PATH") для чтения из системных переменных окружения, и он работает нормально при нормальной сборке приложения.Но мне нужно запустить эту программу Go как сервис, который я сделал с помощью systemd, и в этом случае он не может читать переменные окружения.Есть ли способ решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Вы можете следовать из здесь , чтобы использовать переменные окружения.Я использую для реализации переменных окружения в моем проекте GODOTENV go library.Он очень прост в реализации и не зависит от платформы.

Просто запустите

err = godotenv.Load(filepath.Join(path_dir, ".env"))

и все готово.Теперь вы можете использовать код os.Getenv("APP_PATH") для чтения ключей из файла .env, и он отлично работает с сервисом systemd.

0 голосов
/ 31 января 2019

Это зависит от того, как вы запускаете службу systemd.Systemd предоставляет набор инструкций, которые вы должны использовать:

[Unit]
Description=My service
After=network.target

[Service]
Type=simple
User=user
Group=user
EnvironmentFile=/home/user/env_file
ExecStart=/bin/bash -c -l '/home/user/go_program'
# ... other directive goes here

[Install]
WantedBy=multi-user.target
  • EnvironmentFile - файл с переменными ENV, этот файл будет загружен для вас systemd.

  • User, Group - под каким пользователем и группой должна запускаться программа.

  • ExecStart=/bin/bash -c -l '/home/user/go_program' - параметры -l делают bash действующим какесли он был вызван как оболочка входа , то будет загружена переменная в вашем .bash_profile (см. раздел User и Group).
0 голосов
/ 31 января 2019

У нас есть переменные окружения в файле .env и мы используем godotenv

    import {
       "github.com/joho/godotenv"
    }

    func main() {

        dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
        if err != nil {
            log.Fatal(err)
        }
        environmentPath := filepath.Join(dir, ".env")
        err = godotenv.Load(environmentPath)
        fatal(err)
    }

, и это работает, когда мы запускаем наши приложения в режиме демона

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...