Komut dosyası aracılığıyla önyüklemede genel ortam değişkenleri nasıl ayarlanır ve oturum açmadan önce çalışan bir uygulama için kullanılabilir hale nasıl getirilir?


17

Önyükleme çalışan bir hizmet var ve bu hizmet bazı ortam değişkenleri veren arka planda bir bash komut dosyası çağırır. Yaşadığım sorun, bu ortam değişkenlerinin komut dosyamın yürütülmesi tamamlanır tamamlanmaz arka plan işleminin üst öğesine gönderilmiyor olmasıdır.

Ayrıca, komut dosyası çalıştırıldıktan sonra hizmet daha sonra sahip olduğum bir uygulamayı başlatan başka bir komut dosyasını çağırır. Bu uygulamanın bu ortam değişkenlerine erişmesi gerekiyor.

Çalıştırdığım RHEL sistemi, kullanıcı tarafından hiçbir zaman oturum açmamak anlamına gelir, yalnızca önyükleme yapar ve uygulamayı başlatır. Bir üst işlem / kabuk için ortam değişkenleri gerçekten bir alt arka plan işlem kabuğu tarafından ayarlanamayacağını biliyorum .

Ben (benim için işe yaramadı) benim hizmet (ve benim için işe yaramadı) ekleyerek değil, benim hizmet tarafından çağrılan (mutlaka arka planda değil) bir komut dosyası aracılığıyla bunu yapmak için bir yol gerekir bir /etc/environmentveya .profileya da bunun gibi bir şey.

Hizmetimde ortam değişkenlerini eklemeye çalıştım (ne yapmak istediğimi değil):

    export TEST=192.168.1.1

Ben de bunu hizmetimde denedim:

    TEST=192.168.1.1
    export TEST=${TEST}

Hizmetimin bash betiğini nasıl çağırdığını değiştirmeyi denedim:

    /bin/asdf/script &

(Ben aldığım aynı kabuğun da çalışacak şekilde ben de senaryoyu kaynak çalıştı bu ):

    . ./bin/asdf/script
    #I'm very confused why this didn't work

Ben de buldum bu ilginç görünüyordu hangi ama gerçekten benim durumumda başarmak vermedi.

Yanıtlar:


12

Değişkenleri toplamak için bir komut dosyası koymayı deneyebilirsiniz /etc/profile.d/

Misal:

/etc/profile.d/somescript.sh

#!/bin/bash
TEST=$(cat /var/somefile)
export $TEST

/etc/profileherhangi bir komut dosyasını çalıştıracak bir çağrı yapar /etc/profile.d/ve bu, kök dahil sistemdeki tüm kullanıcılar için geçerlidir.


Burada bir şey olabilirsiniz. Komut dosyası IA nedenlerle / etc dizininde bulunamadığından beri tam olarak bunu yapmak istemiyorum. Ama bence senaryomuza işaret eden bir sembolik link oluşturabilirim. Ancak işleri karmaşık hale getirmek için, komut dosyası tarafından ayarlanan bazı ortam değişkenleri, hizmet tarafından ayarlanan ortam değişkenlerinden gelir. Bu nedenle, hizmet betiği sona ermeden önce değişkenlerin önceden ayarlanması gerektiğinden, bu işe yaramayabilir, ancak çok erken değil veya gereken ortam değişkenleri henüz hizmet tarafından oluşturulmamış olabilir.
sqenixs

Hizmette ayarlanan değişkenlere bağımlılıktan kurtulabilirim. Bu durumda, hizmet başlamadan önce komut dosyası çalıştırıldığı sürece çalışacağını düşünüyorum. Giriş kabuğunun ne zaman başlatıldığını biliyor musunuz? Veya giriş kabuğunun ne zaman başladığını kontrol edebilir miyim? Çalışma seviyem için rcX.d dizininde bir hizmetim yok.
sqenixs

1

Bir sürecin mevcut başka bir sürecin ortamını etkilemesinin yolu yoktur. Süreçler yalnızca alt süreçlerinin ortamını etkiler.

Bu nedenle, bu ortam değişkenlerini, gereksinim duyan uygulamanın bir atasında ayarlamanız gerekir. Hizmetinizin ortam ayarı bash betiğini ve uygulamayı ayrı olarak çağırmasını sağlamak yerine, hizmetinizin ortam değişkenlerini ayarlayan ve uygulamayı başlatan bir bash betiği çağırmasını sağlayın.

#!/bin/bash
. /path/to/environment/variable/setter.bash
exec /path/to/application

Çevrimiçi okudum ne kadar, yine de işe almak için kesmek (bir kaynak komut dosyası üzerinde eval ile ilgili ya da gdb kullanarak bir şey) vardır. Ben geçerli "kabuk" (hizmetinizi yürütme sırasında önyükleme sırasında bir kabuk vardır?) Komutları çalıştırabilirseniz, o zaman bu da iyi olurdu, arka planda olmak aşırı ilgilenmiyorum.
sqenixs

Ne yazık ki, başlatılan birçok farklı işlem olduğundan ve uygulama başlatma komut dosyasından yapılandırılan şeyler olduğundan uygulamayı hizmetten başlatamıyorum ve bunlar IA hizmetinden ayrı tutulmalıdır.
sqenixs

@sqenixs Kabuk, diğerleri gibi bir süreçtir. “Kabukta olmak” diye bir şey yoktur. “Bir kaynak komut dosyasında değerlendirme” den bahsettiğinizde, bu bir programın (kabuk komut dosyası olmayabilir) kabuk sözdizimindeki tanımları yazdırdığı ve kabuk komut dosyasının bunları yorumladığı bir protokoldür. Gdb ile ortam değişkenlerinin ayarlanması işe yarayabilir veya herhangi bir etkisi olmayabilir veya uygulamanızı kilitleyebilir; Tahmin edebileceğiniz gibi, üretimde bir hata ayıklayıcı kullanılması önerilmez (ve yine de iyi bir nedenden dolayı).
Gilles 'SO- kötü olmayı bırak'

Muhtemelen sorununuza bir çözüm var, ancak gereksinimlerinizle ilgili daha kesin olmanız gerekiyor. Sorunuzda, “komut dosyası çalıştırıldıktan sonra hizmeti başlatan başka bir komut dosyasını çağırdığında” yazarsınız. Yani bir çözüm var gibi görünüyor: diğer script içindeki ortam değişkenlerini ayarlayın. Ancak bir yorumda “uygulamayı hizmetten başlatamayacağınızı” yazıyorsunuz. Peki, hangisi?
Gilles 'SO- kötü olmayı bırak'

belki de / sbin / init ortamını önyükleme zamanında yapın veya yapılandırın. Her süreç zaten bir init çocuğu olduğundan, çocuk süreci çevreyi kazanabilir. Sadece bir düşünce / tahmin.
Nikhil Mulley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.