Soru Sistemd hizmetinde ortam değişkeni nasıl ayarlanır?


Benim bir Systemd ile Arch Linux sistemi ve kendi servisimi yarattım. Adresindeki yapılandırma servisi /etc/systemd/system/myservice.service buna benzer:

[Unit]
Description=My Daemon

[Service]
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

Şimdi bunun için ayarlanmış bir ortam değişkenine sahip olmak istiyorum. /bin/myforegroundcmd. Bunu nasıl yaparım?


119
2017-08-01 19:43


Menşei




Cevaplar:


Zaman değişiyor ve en iyi uygulamalar.

şimdiki Bunu yapmanın en iyi yolu koşmaktır systemctl edit myserviceSizin için bir geçersiz kılma dosyası oluşturacak veya mevcut bir dosyayı düzenlemenize izin verecek.

Normal kurulumlarda bu bir dizin oluşturur /etc/systemd/system/myservice.service.dve bu dizinin içinde adı kendi içinde biten bir dosya oluşturur .conf (tipik, override.conf) ve bu dosyada dağıtılan ünitenin herhangi bir parçasını ekleyebilir veya geçersiz kılabilirsiniz.

Örneğin, bir dosyada /etc/systemd/system/myservice.service.d/myenv.conf:

[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"

Ayrıca, eğer dizin varsa ve boşsa, servisinizin devre dışı bırakılacağını unutmayın! Dizinde bir şey koymak istemiyorsanız, var olmadığından emin olun.


Referans olarak, eski yol:

Önerilen yol bunu yapmak bir dosya oluşturmak /etc/sysconfig/myservice değişkenlerinizi içerir ve ardından bunları yükleyin. EnvironmentFile.

Tüm ayrıntılar için, Fedora'nın belgelerine bakın. bir sistem komut dosyası nasıl yazılır.


144
2017-08-01 20:07



Sanırım sysconfig yol Fedora'ya özgüdür ama soru Arch Linux hakkındadır. Paluh'un cevabı bence daha ilginç - Ludovic Kuty
/etc/sysconfig Fedora özgüdür. AFAIR Arch Linux, yapılandırma dosyalarını bir yere özgü bir yere sahip olduğu için zorluyordu. /etc Fedora'ya özgü konum yerine. Sevmek /etc/myservice.confEkstra dosya kullanmama rağmen burada doğru yol görünmüyor. - Michał Górny
Hayır hayır hayır. / etc / sysconfig önerilmemektedir. Debian'dan / etc / default / * ile birlikte önerilmemektedir, çünkü bunlar anlamsızdır ve isimler anlamsızdır ve sadece geriye dönük uyumluluk nedenleriyle anlamlıdırlar (hepsi / etc sistemin yapılandırmasıyla ilgilidir, sadece / etc / değil) sysconfig ve / etc / defaults varsayılanı değil, geçersiz kılmalar içindir. Tanımları doğrudan ünite dosyasına koyun veya mümkün değilse, pakete özgü bir konuma sahip bir enviornment dosyasında (Michał'in yorumunu önerir). - zbyszek
@FrederickNord Sadece değişken = değer çiftleri gibi DJANGO_SETTINGS_MODULE=project.settings, Her satıra bir tane. - Michael Hampton♦
@MichaelHampton "Geçerli en iyi yol" için dokümantasyon linki ekleyebilir misiniz? - jb.


Cevap, değişkenin sabit (yani, kullanıcının aldığı birim tarafından değiştirilmemesi gerektiği) veya değişkenin (kullanıcı tarafından ayarlanması gereken) olması gerekip gerekmediğine bağlıdır.

Yerel birim olduğundan, sınır oldukça bulanık ve her iki şekilde de işe yarayacaktı. Ancak, dağıtmaya başladıysanız ve sonuçta /usr/lib/systemd/systemBu önemli olurdu.

Sabit değer

Değerin örnek başına değişmesi gerekmiyorsa, tercih edilen yol, Environment=doğrudan birim dosyasında:

[Unit]
Description=My Daemon

[Service]
Environment="FOO=bar baz"
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

Bunun avantajı, değişkenin ünite ile tek bir dosyada tutulmasıdır. Bu nedenle, birim dosya sistemleri arasında hareket etmek daha kolaydır.

Değişken değer

Ancak, sysadmin'in yerel olarak ortam değişkeninin değerini değiştirmesi gerektiğinde yukarıdaki çözüm işe yaramaz. Daha spesifik olarak, birim dosyasının güncellendiği her seferinde yeni değerin ayarlanması gerekecektir.

Bu durumda, fazladan bir dosya kullanılacak. Nasıl - genellikle dağıtım politikasına bağlıdır.

Özellikle ilginç bir çözüm kullanmaktır /etc/systemd/system/myservice.service.d dizin. Diğer çözümlerden farklı olarak, bu dizin, systemd'nin kendisi tarafından desteklenir ve bu nedenle, dağıtıma özgü olmayan yollarla birlikte gelir.

Bu durumda, /etc/systemd/system/myservice.service.d/local.conf Bu birim dosyasının eksik parçalarını ekler:

[Service]
Environment="FOO=bar baz"

Daha sonra, systemd servisi başlatırken iki dosyayı birleştirir ( systemctl daemon-reload Bunlardan birini değiştirdikten sonra). Ve bu yol doğrudan sistemd tarafından kullanıldığından, kullanmıyorsunuz EnvironmentFile= bunun için.

Değerin yalnızca etkilenen sistemlerin bazılarında değiştirilmesi gerekiyorsa, her iki çözümü de birleştirebilir, doğrudan üniteye bir varsayılan ve diğer dosyada yerel bir geçersiz kılma sağlayabilirsiniz.


67
2018-04-23 07:48



systemctl daemon-reload systemd'yi yeniden yükleme komutu - Dmitry Buzolin
EnvironmentFile= değerler şifreler gibi sırlar olduğunda daha iyidir. Görmek cevabım detaylar için. - Don Kirkby


http://0pointer.de/public/systemd-man/systemd.exec.html#Environment= - İki seçeneğiniz var (biri Michael tarafından işaretlenmiş):

Environment=

ve

EnvironmentFile=

34
2017-10-16 13:55





Michael bir tane temiz bir çözüm verdi ama ben script'ten güncelleştirilmiş env değişkenini almak istedim. Ne yazık ki basd komutlarını çalıştırmak, systemd birim dosyasında mümkün değildir. Neyse ki ExecStart'un içindeki bashı tetikleyebilirsin:

http://www.dsm.fordham.edu/cgi-bin/man-cgi.pl?topic=systemd.service&ampsect=5

Bu ayarın doğrudan kabuk komut satırlarını desteklemediğini unutmayın. Kabuk komut satırları kullanılacaksa, bunların bir tür kabuk uygulamasına açıkça geçirilmesi gerekir.

Örneğimizde örnek şu şekildedir:

[Service]
ExecStart=/bin/bash -c "ENV=`script`; /bin/myforegroundcmd"

6
2017-07-23 13:31



Bu, birden fazla nedenden dolayı işe yaramaz ("tek adımlı" bir servis olmadığı sürece, oldukça anlamsızdır). Çalışmak için aşağıdakileri almayı başardım: /bin/bash -a -c 'source /etc/sysconfig/whatever && exec whatever-program'. -a Alt süreçlere çevreyi dışa aktarılmasını sağlar (tüm değişkenleri öneklemek istemediğiniz sürece whatever ile export ) - Otheus
neden işe yaramayacak? Her zaman, betiği yürütmeyi içeren tüm komutu tetiklemelidir, değil mi? - user1830432
Olabilir ExecStart=/usr/bin/env ENV=script /bin/myforegroundcmd Bu durumda biraz daha iyi bir çözümdür. - kstep
@Otheus: Harika bir cevap, Tomcat 8 Unit dosyası oluşturmam gerektiğinde günlerce kaydedildi. - Daniel
Bir systemd servis dosyasındaki "in" bash komutunu yürütmenin bir yolu var. Bu bağlantıya bakın: coreos.com/os/docs/latest/... - Mark Lakata


Tarafından cevaplar Michael ve Michal yararlıdır ve bir systemd hizmeti için bir ortam değişkeninin nasıl ayarlanacağına dair orijinal soruyu yanıtlar. Ancak, bir Genel kullanım Ortam değişkenleri için, şifreleriniz gibi, yanlışlıkla uygulamanızın koduyla kaynak kontrolüne bağlı olmayacak bir yerde hassas verileri konfigüre etmektir.

Bu nedenle, bir ortam değişkenini hizmetinize aktarmak istersiniz. yapma kullanım Environment= birim yapılandırma dosyasında. kullanım EnvironmentFile= ve yalnızca hizmet hesabı (ve root erişimi olan kullanıcılar) tarafından okunabilen başka bir yapılandırma dosyasına işaret edin.

Birim konfigürasyon dosyasının detayları, bu komutla herhangi bir kullanıcı tarafından görülebilir:

systemctl show my_service

Bir yapılandırma dosyası koydum /etc/my_service/my_service.conf ve sırlarımı oraya koy.

MY_SECRET=correcthorsebatterystaple

Sonra servis birimi dosyasımda kullandım EnvironmentFile=:

[Unit]
Description=my_service

[Service]
ExecStart=/usr/bin/python /path/to/my_service.py
EnvironmentFile=/etc/my_service/my_service.conf
User=myservice

[Install]
WantedBy=multi-user.target

Kontrol ettim ps auxe Bu ortam değişkenlerini göremez ve diğer kullanıcıların erişim hakkı yoktur. /proc/*/environ. Elbette kendi sisteminize bakın.


6
2018-05-04 00:29