Dịch vụ của người Việt Nam -command và các biến môi trường


8

Tôi đang cố gắng để bắt đầu một dịch vụ đòi hỏi một env. biến được đặt thành đường dẫn nhất định. Tôi đặt biến này trong "/etc/profile.d/". Tuy nhiên, khi tôi bắt đầu dịch vụ này bằng servicelệnh, nó không hoạt động.

dịch vụ đàn ông:

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

Vì vậy, có vẻ như serviceđang loại bỏ các biến của tôi. Làm thế nào tôi nên thiết lập các biến để giữ cho chúng khỏi bị loại bỏ. Hoặc đó là điều tôi không nên làm.

Tôi có thể bắt đầu dịch vụ theo cách thủ công bằng cách sử dụng các tập lệnh init hoặc thậm chí mã hóa đường dẫn vào tập lệnh, nhưng tôi muốn biết cách sử dụng nó với servicelệnh.

Câu trả lời:


4

Kể từ Fedora 16, servicechỉ chấp nhận LANGTERMcác biến môi trường, mọi thứ khác sẽ bị loại bỏ. Vì vậy, ngay cả khi {CentOS, RHEL} hiện tại của bạn chấp nhận các biến bằng cách nào đó, hãy chuẩn bị cho tương lai khi nó không còn hoạt động nữa.

Vì vậy, mã hóa cứng tập lệnh init và / hoặc thiết lập các biến trong tệp cài đặt daemon sẽ là lựa chọn của bạn.


Nhược điểm là mỗi lần cập nhật ứng dụng, tôi phải thay đổi tệp, nhưng tôi đoán tôi chỉ phải ... (... không cập nhật thường xuyên)
Esa Varemo

Vâng, "cập nhật thường xuyên" là một tiêu chuẩn ngày nay. Sống với nó.
Janne Pikkarainen

6

Bạn nên đặt các cài đặt cấu hình trong một cấu hình /etc/sysconfig/<servicename>mà sau đó được đọc bởi tập lệnh init.

Trân trọng

Bram


Là một mẹo khác trong /etc/sysconfig/<servicename>tệp, bạn có thể sử dụng bash's sourceđể tải tệp từ /etc/profile.dđể bắt chước môi trường đăng nhập shell.
Adam Gent

2

Từ man 5 init:

   Môi trường làm việc
       Mỗi công việc được chạy với môi trường từ các sự kiện hoặc lệnh đã khởi động nó. Ngoài ra, bạn có thể xác định mặc định trong
       công việc có thể được ghi đè sau đó và chỉ định biến môi trường nào được xuất vào các sự kiện được tạo cho công việc.

       Biến môi trường UPSTART_EVENT đặc biệt chứa danh sách các sự kiện đã bắt đầu công việc, nó sẽ không xuất hiện nếu
       công việc đã được bắt đầu bằng tay.

       Ngoài ra, các kịch bản trước dừng và sau dừng được chạy với môi trường của các sự kiện hoặc lệnh đã dừng công việc.
       Biến môi trường UPSTART_STOP_EVENT chứa danh sách các sự kiện đã dừng công việc, nó sẽ không xuất hiện nếu công việc
       đã được dừng bằng tay.

       Tất cả các công việc cũng chứa các biến môi trường UPSTART_JOB và UPSTART_INSTANCE, chứa tên của công việc và thể hiện.
       Chúng hầu hết được sử dụng bởi tiện ích initctl (8) để mặc định thực hiện công việc mà các lệnh được gọi từ đó.

       env KHÓA [= GIÁ TRỊ]
              Xác định một biến môi trường mặc định, giá trị có thể bị ghi đè bởi sự kiện hoặc lệnh bắt đầu công việc.
              Nếu được chỉ định, có giá trị, giá trị biến được đưa ra giá trị GIÁ TRỊ. Nếu chỉ đưa ra hungKEY, thì giá trị được lấy
              từ môi trường riêng của init (8) daemon.

       phím xuất
              Xuất giá trị của biến môi trường vào các sự kiện bắt đầu (7), bắt đầu (7), dừng (7) và dừng (7) cho việc này
              công việc và cho tất cả các sự kiện kết quả (không chỉ những sự kiện liên quan đến công việc hiện tại).

Bổ sung bạn có thể làm grep env /etc/init/*để xem cách sử dụng

Đây là đầu ra của tôi:

/etc/init/container-detect.conf:env container
/etc/init/container-detect.conf:env LIBVIRT_LXC_UUID
/etc/init/container-detect.conf: # là để kiểm tra "container" trong môi trường của init.
/etc/init/container-detect.conf: [-d / Proc / vz] && [! -d / Proc / bc] && container = openvz
/etc/init/mounted-debugfs.conf:env MOUNTPOINT = / sys / kernel / gỡ lỗi
/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-nút
/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 / log / nginx.pid
/etc/init/procps.conf:env UPSTART_EVENT =
/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 = "đã bắt đầu"
/etc/init/wait-for-state.conf:env TARGET_GOAL = "bắt đầu"

Và cho một ví dụ đầy đủ xem một số các kịch bản đó. Đây nginx.conf:

# nginx

mô tả "nginx http daemon"
tác giả "Philipp Klose"

bắt đầu (hệ thống tập tin và thiết bị mạng IFACE = lo)
dừng lại trên runlevel [! 2345]

env DAEMON = / usr / địa phương / nginx / sbin / nginx
env PID = / usr / local / nginx / log / nginx.pid

mong đợi ngã ba
hồi sinh
giới hạn hồi sinh 10 5
# không bao giờ

kịch bản trước khi bắt đầu
 $ DAEMON -t
 nếu [$? -Một 0]
 rồi thoát $?
 fi
kịch bản kết thúc

thực hiện $ DAEMON
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.