Unix servisi çevre değişkenlerini nasıl görebilir?


52

Ortam değişkenimi aşağıdakileri kullanarak ayarladım /etc/profile:

export VAR=/home/userhome

O zaman yaparsam echo $VARgösterir/home/userhome

Ancak bu değişkene referans verdiğimde bu değişkeni /etc/init.d/servicenamebulamaz. Aşağıdaki içeriğe sahip dosyayı service servicename statuskullanarak çalıştırdığımda /etc/init.d/servicename:

case "$1" in
status)    
    cd $VAR/dir
    ;;
esac

diyor ki /dir: No such file or directory

Ama /etc/init.d/servicename statusyerine koştum çalışırservice servicename status

Unix servisini ortam değişkenlerini nasıl görebilirim?


Sistem 5 rckomut dosyasının doğrudan çağrılmasının, komut dizisinin tüm çağrıları gizli bir kanca tarafından başlatıldığı için sistem işletim sistemlerinde de bu şekilde çalışmadığını unutmayın systemctl.
JdeBP

Yanıtlar:


70

Sorundur serviceşeritler tüm ortam değişkenleri ama TERM, PATHve LANGbu iyi bir şey olduğu. Komut dosyasını doğrudan çalıştırıyorsanız, hiçbir şey ortam değişkenlerini kaldırmaz, böylece her şey çalışır.

Dış ortam değişkenlerine güvenmek istemezsiniz çünkü başlangıçta ortam değişkeni muhtemelen mevcut değildir ve init sisteminiz muhtemelen ayarlamaz.

Hala bu tür değişkenlere güvenmek istiyorsanız, bir dosyaya kaynak verin ve buradaki değişkenleri okuyun, örneğin /etc/default/servicenameiçerikle oluşturun:

VAR=value

ve bunu init betiğinden alın, örneğin:

[ -f /etc/default/service-name ] && . /etc/default/service-name

if [ -z "$VAR" ] ;  then
  echo "VAR is not set, please set it in /etc/default/service-name" >&2
  exit 1
fi

case "$1" in
status)    
    cd "$VAR"/dir
    ;;
esac

13
Çok yardımcı oldum, teşekkürler. Diğer Linux yenileri için, burada şifreli Bash olayı. [ ... ]şartlı bir test için bir kısa yoldur; bkz bu cevabı . Dosyanın var olup olmadığını kontrol etmek -fiçin bir ifargümandır. &&kısa devre işlecidir: ilk komutu 0 .kaynak veya nokta işleci ile çıkarsa, yalnızca ikinci komutu yapın : dosya adı bağımsız değişkenindeki komutları okuyun ve uygulayın. Sıfır uzunluklu bir dize denetlemek için -zbir ifargümandır. >&2stderr'e çıktı gönder. Ayrıca bkz . Giriş .
Mark Berry

@MarkBerry , değil bir -fparçasıdır . [if
Chris Down

@ChrisDown, teşekkürler. Yani " [ ... ]şartlı bir testkomut için kısa yol ; bu cevaba bakınız . Bir dosyanın olup olmadığını kontrol etmek -fiçin bir testargümandır."
Mark Berry

@MarkBerry Doğru. Başka bir komut olarak düşünebilirsiniz [(veya test) - bunların hepsi ifçıkış durumuna göre işlem yapmaktır.
Chris Down

Buna benzer bir durumla karşılaştım, ancak $VARinit betiğinde yer almam gerekmiyor , init betiğinin alt kısmında bulunan 2 veya 3 çağrıları farklı bir programda kullanabilmem gerekiyor . Örneğin. init betiği, ihtiyaç duyulan Program 2'yi çağıran Program 1'i (Java) çağıran start-stop-daemon'u çağırır $VAR. Bu cevabı almayı denedim ama benim durumumda işe yaramadı. $VARBunun Program 2'ye sunulmasını nasıl sağlayabilirim ?
Hayal kırıklığına

1

Benim durumumda, ben bir ihtiyaç RAILS_ENViçinde ayarlandığını /etc/bash.bashrc: export RAILS_ENV=staging. Ekledim $(grep RAILS_ENV /etc/bash.bashrc)ve bu değişken betiğin kullanımına sunuldu. Bu şekilde yaptım, böylece dosyanın geri kalanını dahil etmek zorunda kalmamıştım.


-1

Bir çirkin da çalışacaktır çözüm:

function exec() {
    args=( $@ )
    command=${args[0]}
    dummy=${args[1]}
    whoami=`whoami`
    if [ -z "$dummy" ]; then
        me=`basename $0`
        runuser -l ${whoami} -c "bash /etc/init.d/${me} ${command} dummy"
    else
       printenv
   fi
}

case $1 in
    status)
        status
        ;;
    start|stop|kill|restart)
        exec $*
        ;;
    *)
        usage
esac
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.