Jak określić dyrektywę systemową dotyczącą środowiska zawierającą =?

20

Chcę sprecyzować Environment systemddyrektywę zawierającą =np

Environment=CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

i dostać błąd

[/lib/systemd/system/archiva.service:10] Invalid environment assignment, ignoring: CATALINA_OPTS=-Dappserver.home\=/var/lib/archiva/apache

w journalctl -xe. Próbowałem przytoczyć z "a 'i uciec =z \bezskutecznie. To wydaje się nieudokumentowane.

Karl Richter
źródło

Odpowiedzi:

40

Myślę, że twój problem wynika z miejsca w treści zmiennej środowiskowej. Patrząc na przykłady z systemowych dokumentów , przypisanie powinno być pojedynczym ciągiem znaków:

Przykład:

Environment="ONE=one" 'TWO=two two'
ExecStart=/bin/echo $ONE $TWO ${TWO}

To będzie wykonywał / bin / echo z czterema argumentami: one, two, two, i two two.

Przykład:

Environment=ONE='one' "TWO='two two' too" THREE=
ExecStart=/bin/echo ${ONE} ${TWO} ${THREE}
ExecStart=/bin/echo $ONE $TWO $THREE

To powoduje echo miano dwukrotnie, po raz pierwszy z argumentów 'one', 'two two' too, , i po raz drugi z argumentów one, two two, too.

Przetestowałem to za pomocą następującej usługi (zwróć uwagę na cytaty wokół całego zadania):

[Unit]
Description=My Daemon

[Service]
Environment='CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current'
ExecStart=/bin/echo ${CATALINA_OPTS}

[Install]
WantedBy=multi-user.target

I uzyskałem pożądaną moc wyjściową w journalctl:

Apr 26 08:19:29 laptop echo[28439]: -Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

Oczywiście łatwiej byłoby użyć EnvironmentFilezamiast tego. Zastąpienie Environmentponiższym dało ten sam pożądany rezultat:

EnvironmentFile=/tmp/foo

Jeśli jest /tmp/foozawarty (zauważ brak cytatów):

CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current
muru
źródło
Jeśli chodzi o cytując cudzysłowie (na przykład przy użyciu CATALINA_OPTSw systemdśrodowisku Apache tomcat7.0.61) za pomocą EnvironmentFilenaprawdę jest do zrobienia. Dzięki!
Karl Richter,
Jaki jest katalog standardowy / convention do przechowywania pliku EnvironmentFile na Ubuntu? W innych systemach widziałem / etc / sysconfig /
Davos
1
@Davos byłoby rozsądnym miejscem /etc/default. Pliki tam były historycznie używane do umieszczania zmiennych środowiskowych dla odpowiednich skryptów inicjujących.
mur
Mam już ten plik w moim systemie / etc / environment, który zawiera zmienną PATH, czy dołączenie do niego byłoby sensowne?
Davos,
1
@Davos, który obejmuje cały system. Jeśli nie ma problemu z ustawieniem zmiennej dla praktycznie każdego procesu, na pewno. Zauważ, że /etc/environmentnie jest przetwarzane przez powłokę; poza prostym przypisywaniem zmiennych, jego składnia bardzo różni się od składni systemowej wymienionej powyżej lub ogólnej składni powłoki.
muru