Назад | Перейти на главную страницу

s6 supervisor: набор переменных с s6-envdir не может быть использован

Пытаюсь осмыслить s6 supervisor suite. Я разобрался, как запустить и записать, но я застрял с s6-envdir и не знаю, как его использовать.

Я вижу, что переменная среды установлена, но я не могу получить к ней доступ.

Проиллюстрировать:

# According to the docs, set a variable
cat /local/s6/services/ping_stdout/env/PING_HOST
ya.ru
# Make sure there's no such variable in my current env
env | grep PING_HOST
echo $?
1
# Make sure it gets exported if I use s6-envdir
s6-envdir /local/s6/services/ping_stdout/env env | grep PING_HOST
PING_HOST=ya.ru
# Now try to get it printed
s6-envdir /local/s6/services/ping_stdout/env echo "=== ${PING_HOST} ==="
===  ===

Он не используется, но если я попытаюсь использовать что-то, что уже есть в моем env, проблем нет:

s6-envdir /local/s6/services/ping_stdout/env echo "=== ${ZSH} ==="
=== /home/hoodoo/.oh-my-zsh ===

Я что-то не так понял?

Как использовать переменные, установленные с помощью s6-envdir?

Это правильная форма:

s6-envdir /local/s6/services/ping_stdout/env sh -c 'echo === ${PING_HOST} ==='

Вам нужно запустить подоболочку, которая будет видеть подготовленные переменные env s6-envdir. Также вам нужны одинарные кавычки, чтобы убедиться, что подоболочка выполнит замену и распечатает переменную.

Если вы запустите демон, это должно быть примерно так:

s6-envdir /local/s6/services/ping_stdout/env sh -c 'exec /full/path/to/your/executable'

В exec необходим, чтобы не было лишней оболочки. Это необходимо, чтобы убедиться, что вы сигнализируете процессу напрямую через s6.