"Layanan" -perintah dan variabel lingkungan

8

Saya mencoba memulai layanan yang memerlukan env. variabel yang akan diatur ke jalur tertentu. Saya mengatur variabel ini di "/etc/profile.d/". Namun ketika saya memulai layanan ini menggunakan serviceperintah, itu tidak berfungsi.

layanan pria:

service runs a System V init script in as predictable environment as possible,
removing most environment variables and with current working directory set to /.

Jadi sepertinya itu servicemenghapus variabel saya. Bagaimana cara mengatur variabel agar tidak dihapus. Atau itu sesuatu yang seharusnya tidak saya lakukan.

Saya bisa memulai layanan secara manual menggunakan skrip init, atau bahkan membuat hardcode path ke skrip, tapi saya ingin tahu cara menggunakannya dengan serviceperintah.

Esa Varemo
sumber

Jawaban:

4

Pada Fedora 16, servicehanya menerima LANGdan TERMvariabel lingkungan, yang lainnya dibuang. Jadi, bahkan jika {CentOS, RHEL} Anda saat ini menerima variabel tersebut, bersiaplah untuk masa depan yang tidak lagi berfungsi.

Jadi, mengkodekan skrip init dengan keras dan / atau mengatur variabel dalam file pengaturan daemon itu sendiri akan menjadi pilihan Anda.

Janne Pikkarainen
sumber
The downside adalah bahwa setiap kali saya memperbarui aplikasi saya harus mengubah file, tapi saya kira saya hanya perlu ... (... tidak memperbarui sering)
Esa Varemo
Nah, "pembaruan sering" adalah norma saat ini. Jalani saja.
Janne Pikkarainen
6

Dianjurkan untuk menempatkan pengaturan konfigurasi dalam konfigurasi /etc/sysconfig/<servicename>yang kemudian dibaca oleh skrip init.

Salam

Bram

Bram
sumber
Sebagai tip lain dalam /etc/sysconfig/<servicename>file, Anda dapat menggunakan bash sourceuntuk memuat file dari /etc/profile.duntuk meniru lingkungan login shell.
Adam Gent
2

Dari man 5 init:

   Lingkungan kerja
       Setiap pekerjaan dijalankan dengan lingkungan dari peristiwa atau perintah yang memulai itu. Selain itu, Anda dapat menentukan default di
       pekerjaan yang mungkin ditimpa kemudian dan tentukan variabel lingkungan mana yang diekspor ke acara yang dihasilkan untuk pekerjaan itu.

       Variabel lingkungan UPSTART_EVENTS khusus berisi daftar peristiwa yang memulai pekerjaan, itu tidak akan ada jika
       pekerjaan dimulai secara manual.

       Selain itu, skrip pre-stop dan post-stop dijalankan dengan lingkungan peristiwa atau perintah yang menghentikan pekerjaan.
       Variabel lingkungan UPSTART_STOP_EVENTS berisi daftar peristiwa yang menghentikan pekerjaan, itu tidak akan ada jika pekerjaan
       dihentikan secara manual.

       Semua pekerjaan juga mengandung variabel lingkungan UPSTART_JOB dan UPSTART_INSTANCE, yang berisi nama pekerjaan dan instance.
       Ini sebagian besar digunakan oleh utilitas initctl (8) secara default untuk bertindak pada pekerjaan yang dipanggil dari perintah.

       id KUNCI [= NILAI]
              Menentukan variabel lingkungan default, yang nilainya dapat ditimpa oleh acara atau perintah yang memulai pekerjaan.
              Jika ´KEY = VALUE´ ditentukan, variabel KEY diberi nilai VALUE. Jika hanya ´KEY´ yang diberikan, maka nilainya diambil
              dari lingkungan daemon init (8) sendiri.

       ekspor KUNCI
              Mengekspor nilai variabel lingkungan ke awal (7), mulai (7), berhenti (7) dan berhenti (7) peristiwa untuk ini
              pekerjaan dan semua acara yang dihasilkan (bukan hanya yang terkait dengan pekerjaan saat ini).

Selain itu, Anda dapat melakukan grep env /etc/init/*untuk melihat bagaimana digunakan

Ini adalah output saya:

/etc/init/container-detect.conf:env wadah
/etc/init/container-detect.conf:env LIBVIRT_LXC_UUID
/etc/init/container-detect.conf: # adalah untuk memeriksa "container" di lingkungan init.
/etc/init/container-detect.conf: [-d / proc / vz] && [! -d / proc / bc] && container = openvz
/etc/init/mounted-debugfs.conf:env MOUNTPOINT = / sys / kernel / debug
/etc/init/mounted-dev.conf:env MOUNTPOINT = / dev
/etc/init/mounted-proc.conf:env MOUNTPOINT = / proc
/etc/init/mounted-tmp.conf:env MOUNTPOINT = / tmp
/etc/init/munin-node.conf:env DAEMON = / usr / sbin / munin-node
/etc/init/mysql.conf:env HOME = / etc / mysql
/etc/init/nginx.conf:env DAEMON = / usr / local / nginx / sbin / nginx
/etc/init/nginx.conf:env PID = / usr / local / nginx / logs / nginx.pid
/etc/init/procps.conf:env UPSTART_EVENTS =
/etc/init/rc.conf:env INIT_VERBOSE
/etc/init/rc-sysinit.conf:env DEFAULT_RUNLEVEL = 2
/etc/init/rc-sysinit.conf:env RUNLEVEL =
/etc/init/rc-sysinit.conf:env PREVLEVEL =
/etc/init/rc-sysinit.conf:env INIT_VERBOSE
/etc/init/wait-for-state.conf:env TIMEOUT = 30
/etc/init/wait-for-state.conf:env MANUAL_OVERRIDE = "N"
/etc/init/wait-for-state.conf:env WAIT_FOREVER = "N"
/etc/init/wait-for-state.conf:env WAIT_STATE = "dimulai"
/etc/init/wait-for-state.conf:env TARGET_GOAL = "mulai"

Dan untuk contoh lengkap lihat beberapa skrip itu. Di sini nginx.conf:

# nginx

deskripsi "nginx http daemon"
penulis "Philipp Klose"

start on (filesystem dan net-device-up IFACE = lo)
berhenti di runlevel [! 2345]

env DAEMON = / usr / local / nginx / sbin / nginx
env PID = / usr / local / nginx / logs / nginx.pid

berharap garpu
respawn
batas respawn 10 5
#tidak pernah

skrip pra-mulai
 $ DAEMON -t
 jika [$? -ne 0]
 lalu keluar $?
 fi
akhiri skrip

exec $ DAEMON
Jperelli
sumber