Passando variáveis de ambiente ao redor do systemd

4

Primeiro, vamos tirar isso do caminho. EnvironmentFile não é uma opção de acordo com esta resposta .

Tenha paciência comigo, estou indo para um exemplo específico do que estou tentando alcançar. Eu estou tentando entender a maneira recomendada de usar e passar variáveis de ambiente.

Eu tenho um urxvtd.socket :

[Unit]
Description=urxvt deamon (socket activation)
Documentation=man:urxvtd(1) man:urxvt(1)

[Socket]
ListenStream=%t/urxvt/urxvtd-%H

[Install]
WantedBy=sockets.target

Agora, um urxvtd.socket com uma dependência Requires nesse urxvtd.socket:

[Unit]
Description=Urxvt Terminal Daemon
Requires=urxvtd.socket

[Service]
# Needs to know socket file location RXVT_SOCKET environment variable.
# Where will it come from?
ExecStart=/usr/bin/urxvtd -o -q

[Install]
WantedBy=default.target

Agora eu preciso que RXVT_SOCKET seja definido antes de iniciar o i3, já que o i3 terá uma ligação de chave para iniciar o urxvtc (cliente urxvt).

Se eu iniciar o i3 / Xorg sem o systemd (ou seja, com xinitrc), e coloque .zshenv (arquivo de ambiente específico do usuário carregado sempre.):

export RXVT_SOCKET=${XDG_RUNTIME_DIR}/urxvt/urxvtd-machinename

Então, urxvtc lançado pelo i3 inferirá corretamente a variável RXVT_SOCKET e procurará pelo soquete nesse caminho.

No entanto, o urxvtd.service lança urxvtd (o daemon), portanto também precisa de RXVT_SOCKET.

O Archwiki recomenda definir o ambiente em urxvtd.service :

...
Environment=RXVT_SOCKET=%t/urxvtd-%H
...

Mas aí está o problema. Por que a variável de ambiente deve ser definida novamente em urxvtd.service , quando o usuário inicial urxvtd.socket deve defini-la?

Note que é definido novamente em .zshenv para o i3 para obtê-lo. Este é um caso de várias fontes de verdade para uma variável de ambiente simples. .

Percebemos que urxvtd.service exemplo acima tem o caminho incorreto para RXVT_SOCKET definido em .zshenv ? Reitera minha múltipla fonte do argumento da verdade.

Qual é a melhor maneira de lidar com isso?

Eu estava pensando que talvez eu possa definir o RXVT_SOCKET em urxvtd.socket da seguinte forma:

[Socket]
Environment=RXVT_SOCKET
ListenStream=%t/urxvt/urxvtd-%H

E como urxvtd.service é uma dependência, deve haver uma maneira de importar a variável de ambiente. Mas não há. Assim, o dax do urxvtd se comportará como se o RXVT_SOCKET não estivesse configurado, mas o soquete seria criado corretamente devido a urxvtd.socket .

Depois, comecei a cavar um pouco mais e systemctl --user import-environment RXVT_SOCKET deve importar a variável em unidades do systemd. Isso seria realmente o caminho? Então eu também preciso garantir que a importação ocorra antes de o urxvtd.service ser executado. Como isso funcionaria?

Se eu usar o Xorg / i3 com o systemd, acredito que deve haver uma maneira de transferir a variável de ambiente em unidades do systemd.

Neste ponto, é provável que eu acredite que não exista uma solução pura de systemd para tal requisito de propagação de variáveis de ambiente

Acabei usando um shell para agrupar o comando ExecStart , já que o shell herdará o ambiente corretamente.

    
por themagicalyang 01.11.2018 / 14:46

0 respostas