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?
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.
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.
http://0pointer.de/public/systemd-man/systemd.exec.html#Environment= - İki seçeneğiniz var (biri Michael tarafından işaretlenmiş):
Environment=
ve
EnvironmentFile=
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&sect=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"
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.