Saya telah menetapkan variabel lingkungan saya menggunakan /etc/profile
:
export VAR=/home/userhome
Lalu jika saya lakukan echo $VAR
itu menunjukkan/home/userhome
Tetapi ketika saya menaruh referensi ke variabel ini ke dalam /etc/init.d/servicename
file, itu tidak dapat menemukan variabel ini. Ketika saya menjalankan service servicename status
menggunakan /etc/init.d/servicename
file dengan konten berikut:
case "$1" in
status)
cd $VAR/dir
;;
esac
ia mengatakan /dir: No such file or directory
Tapi itu berfungsi jika saya menjalankan /etc/init.d/servicename status
bukanservice servicename status
Bagaimana saya bisa membuat layanan unix melihat variabel lingkungan?
environment-variables
init-script
services
alternatif
sumber
sumber
rc
skrip System 5 secara langsung juga tidak beroperasi seperti itu pada sistem operasi systemd, karena semua doa skrip diubah menjadi doasystemctl
oleh kail tersembunyi.Jawaban:
Masalahnya adalah
service
menghapus semua variabel lingkungan tetapiTERM
,PATH
danLANG
yang merupakan hal yang baik. Jika Anda mengeksekusi skrip secara langsung, tidak ada yang menghapus variabel lingkungan sehingga semuanya berfungsi.Anda tidak ingin bergantung pada variabel lingkungan eksternal karena saat startup variabel lingkungan mungkin tidak ada dan sistem init Anda mungkin tidak akan mengaturnya.
Jika Anda masih ingin bergantung pada variabel seperti itu, sumber file dan baca variabel dari itu, misalnya buat
/etc/default/servicename
dengan konten:dan sumber dari skrip init Anda, misalnya:
sumber
[ ... ]
adalah singkatan untuk tes bersyarat; lihat jawaban ini .-f
adalahif
argumen untuk memeriksa apakah file ada.&&
adalah operator hubung singkat: hanya lakukan perintah kedua jika yang pertama keluar dengan 0..
operator sumber atau titik: baca dan jalankan perintah dari argumen nama file.-z
adalahif
argumen untuk memeriksa string yang panjangnya nol.>&2
kirim output ke stderr. Lihat juga Pengantar jika .-f
adalah bagian dari[
, bukanif
.[ ... ]
adalah singkatan untuktest
perintah bersyarat ; lihat jawaban ini .-f
Adalahtest
argumen untuk memeriksa apakah ada file."[
(atautest
) hanya sebagai perintah lain - yangif
dilakukan adalah mengambil tindakan berdasarkan status keluar.$VAR
berada dalam skrip init, saya perlu itu tersedia untuk program 2 atau 3 panggilan yang berbeda di bagian hilir skrip init. Misalnya. skrip init memanggil start-stop-daemon yang memanggil Program 1 (Java) yang memanggil Program 2 yang perlu$VAR
. Saya mencoba trik dalam jawaban ini tetapi sepertinya tidak berhasil dalam situasi saya. Bagaimana saya bisa memastikan bahwa$VAR
akan tersedia untuk Program 2?Dalam kasus saya, saya membutuhkan
RAILS_ENV
yang diatur dalam/etc/bash.bashrc
:export RAILS_ENV=staging
. Saya menambahkan$(grep RAILS_ENV /etc/bash.bashrc)
dan itu membuat variabel tersedia untuk skrip. Saya melakukannya dengan cara ini sehingga saya tidak perlu memasukkan sisa file.sumber
Satu solusi jelek yang juga akan berfungsi:
sumber