Bagaimana cara mengatur variabel lingkungan global saat boot melalui skrip, dan membuatnya tersedia untuk aplikasi yang berjalan sebelum masuk?


17

Saya memiliki layanan yang berjalan saat boot, dan dalam layanan itu ia memanggil skrip bash di latar belakang yang mengekspor beberapa variabel lingkungan. Masalah yang saya alami adalah bahwa variabel lingkungan tidak dikirim ke induk dari proses latar belakang sehingga segera setelah skrip saya selesai dieksekusi, mereka hilang.

Selain itu, setelah skrip dijalankan, layanan memanggil skrip lain yang memulai aplikasi yang saya miliki. Aplikasi ini membutuhkan akses ke variabel lingkungan tersebut.

Sistem RHEL tempat saya menjalankannya dimaksudkan untuk tidak pernah login oleh pengguna, itu hanya boot dan memulai aplikasi. Saya tahu bahwa variabel lingkungan untuk proses induk / shell tidak dapat benar - benar diatur oleh shell proses latar belakang anak.

Saya perlu cara untuk melakukan ini melalui skrip yang dipanggil oleh layanan saya (tidak harus di latar belakang), bukan dengan menambahkan mereka dalam layanan saya (yang tidak berfungsi baik untuk saya) dan tidak dengan menyimpannya di /etc/environmentatau .profileatau semacamnya.

Dalam layanan saya, saya mencoba menambahkan variabel lingkungan (bukan yang ingin saya lakukan):

    export TEST=192.168.1.1

Saya juga mencoba ini di layanan saya:

    TEST=192.168.1.1
    export TEST=${TEST}

Saya mencoba mengubah cara layanan saya memanggil skrip bash:

    /bin/asdf/script &

Saya juga mencoba sumber skrip sehingga berjalan di shell yang sama (yang saya dapatkan dari ini ):

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

Saya juga menemukan ini yang terlihat menarik tetapi tidak benar-benar berhasil dalam kasus saya.

Jawaban:


12

Anda dapat mencoba menempatkan skrip untuk mengumpulkan variabel /etc/profile.d/

Contoh:

/etc/profile.d/somescript.sh

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

/etc/profilemelakukan panggilan yang akan menjalankan skrip apa pun /etc/profile.d/, dan ini berlaku untuk semua pengguna di sistem termasuk root.


Anda mungkin tertarik pada sesuatu di sini. Saya tidak ingin melakukan hal itu karena skrip tidak dapat ditemukan di direktori / etc karena alasan IA. Tapi saya pikir saya bisa membuat symlink di sana yang menunjuk ke skrip saya. Tetapi untuk mempersulit hal-hal, beberapa variabel lingkungan yang ditetapkan oleh skrip berasal dari variabel lingkungan yang ditetapkan oleh layanan. Jadi ini mungkin tidak berfungsi, karena variabel harus sudah ditetapkan sebelum skrip layanan sampai akhir, tetapi tidak terlalu dini atau variabel lingkungan yang diperlukan belum akan dibuat oleh layanan.
sqenixs

Saya kira saya bisa menghilangkan ketergantungan pada variabel yang ditetapkan dalam layanan. Dalam hal ini, saya pikir itu akan berhasil, selama skrip dijalankan sebelum layanan dimulai. Apakah Anda tahu kapan shell login dimulai? Atau bisakah saya mengontrol ketika shell login mulai? Saya tidak memiliki layanan untuk itu di direktori rcX.d untuk level run saya.
sqenixs

1

Tidak ada cara bagi suatu proses untuk mempengaruhi lingkungan dari proses lain yang ada. Proses hanya mempengaruhi lingkungan proses anak mereka.

Jadi, Anda perlu mengatur variabel lingkungan ini dalam leluhur aplikasi yang membutuhkannya. Alih-alih meminta layanan Anda secara terpisah menjalankan skrip bash pengaturan-lingkungan dan aplikasi, mintalah layanan Anda memanggil skrip bash yang mengatur variabel lingkungan lalu meluncurkan aplikasi.

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

Dari apa yang saya baca online, ada peretasan (ada hubungannya dengan eval pada skrip sumber, atau menggunakan gdb) untuk membuatnya bekerja. Saya tidak terlalu tertarik dengan hal itu di latar belakang, jika saya dapat menjalankan perintah di "shell" saat ini (apakah Anda di shell saat boot ketika layanan Anda dieksekusi?) Maka itu akan baik-baik saja juga.
sqenixs

Sayangnya, saya tidak dapat memulai aplikasi dari layanan, karena ada banyak proses yang berbeda yang dimulai dan hal-hal yang dikonfigurasi dari skrip start aplikasi, dan mereka harus tetap terpisah dari layanan untuk IA.
sqenixs

@sqenixs Shell adalah proses seperti yang lainnya. Tidak ada yang namanya "berada dalam cangkang". Ketika Anda berbicara tentang "eval pada skrip sumber", itu adalah protokol di mana sebuah program (yang mungkin bukan skrip shell) mencetak definisi dalam sintaksis shell, dan skrip shell menafsirkannya. Mengatur variabel lingkungan dengan gdb bisa berfungsi, atau bisa tidak berpengaruh, atau bisa merusak aplikasi Anda; seperti yang Anda bayangkan, menggunakan debugger dalam produksi tidak disarankan (dan, sekali lagi, untuk alasan yang baik).
Gilles 'SANGAT berhenti menjadi jahat'

Mungkin ada solusi untuk masalah Anda, tetapi Anda harus lebih tepat dengan kebutuhan Anda. Dalam pertanyaan Anda, Anda menulis "setelah skrip dijalankan layanan kemudian memanggil skrip lain yang memulai aplikasi". Jadi Anda tampaknya punya solusi: atur variabel lingkungan di dalam skrip lain itu. Tetapi kemudian dalam komentar Anda menulis bahwa Anda “tidak dapat memulai aplikasi dari layanan”. Jadi, mana yang benar?
Gilles 'SANGAT berhenti menjadi jahat'

mungkin, membuat atau mengkonfigurasi lingkungan / sbin / init pada saat boot. Karena setiap proses adalah anak init anyways, proses anak dapat memperoleh lingkungan. Hanya pemikiran / tebak.
Nikhil Mulley
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.