Làm cách nào để đặt các biến môi trường toàn cầu khi khởi động thông qua tập lệnh và để chúng có sẵn cho ứng dụng chạy trước khi đăng nhập?


17

Tôi có một dịch vụ chạy lúc khởi động, và trong dịch vụ đó, nó gọi một tập lệnh bash trong nền xuất một số biến môi trường. Vấn đề tôi gặp phải là các biến môi trường đó không được gửi đến cha mẹ của quá trình nền nên ngay khi tập lệnh của tôi được thực thi xong, chúng sẽ biến mất.

Ngoài ra, sau khi tập lệnh được chạy, dịch vụ sẽ gọi một tập lệnh khác khởi động ứng dụng mà tôi có. Ứng dụng này cần truy cập vào các biến môi trường.

Hệ thống RHEL tôi chạy nó có nghĩa là không bao giờ được đăng nhập bởi người dùng, nó chỉ khởi động và khởi động ứng dụng. Tôi biết rằng các biến môi trường cho một tiến trình cha / shell thực sự không thể được thiết lập bởi một shell process process con.

Tôi cần một cách để thực hiện điều này thông qua một tập lệnh được gọi bởi dịch vụ của tôi (không nhất thiết phải ở chế độ nền), không phải bằng cách thêm chúng vào dịch vụ của tôi (không hoạt động cho tôi) và không phải bằng cách lưu trữ chúng trong /etc/environmenthoặc .profilehoặc bất cứ điều gì như vậy.

Trong dịch vụ của mình, tôi đã thử thêm các biến môi trường (không phải những gì tôi muốn làm):

    export TEST=192.168.1.1

Tôi cũng đã thử điều này trong dịch vụ của mình:

    TEST=192.168.1.1
    export TEST=${TEST}

Tôi đã thử thay đổi cách dịch vụ của tôi gọi tập lệnh bash:

    /bin/asdf/script &

Tôi cũng đã thử tìm nguồn cung cấp kịch bản để nó chạy trong cùng một vỏ (mà tôi nhận được từ cái này ):

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

Tôi cũng thấy điều này có vẻ thú vị nhưng nó không thực sự phát triển trong trường hợp của tôi.

Câu trả lời:


12

Bạn có thể thử đặt một tập lệnh để thu thập các biến trong /etc/profile.d/

Thí dụ:

/etc/profile.d/somescript.sh

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

/etc/profilethực hiện cuộc gọi sẽ chạy bất kỳ tập lệnh nào /etc/profile.d/và điều này áp dụng cho tất cả người dùng trên hệ thống bao gồm cả root.


Bạn có thể đang ở một cái gì đó ở đây. Tôi không muốn làm chính xác điều đó mặc dù tập lệnh không thể nằm trong thư mục / etc vì lý do IA. Nhưng tôi nghĩ rằng tôi có thể tạo một liên kết tượng trưng trong đó trỏ đến kịch bản của tôi. Nhưng để làm phức tạp mọi thứ, một số biến môi trường được đặt bởi tập lệnh đang đến từ các biến môi trường được đặt bởi dịch vụ. Vì vậy, điều này có thể không hoạt động, vì các biến phải được đặt trước khi tập lệnh dịch vụ kết thúc, nhưng không quá sớm hoặc các biến môi trường cần thiết sẽ chưa được dịch vụ tạo ra.
sqenixs

Tôi đoán tôi có thể thoát khỏi sự phụ thuộc vào các biến được đặt trong dịch vụ. Trong trường hợp này, tôi nghĩ nó sẽ hoạt động, miễn là tập lệnh được chạy trước khi dịch vụ khởi động. Bạn có biết khi nào vỏ đăng nhập được khởi động không? Hoặc tôi có thể kiểm soát khi shell đăng nhập khởi động? Tôi không có dịch vụ cho nó trong thư mục RCX.d cho cấp độ chạy của tôi.
sqenixs

1

Không có cách nào để một quá trình ảnh hưởng đến môi trường của một quy trình hiện có khác. Các quy trình chỉ ảnh hưởng đến môi trường của các quy trình con của họ.

Vì vậy, bạn cần đặt các biến môi trường này trong tổ tiên của ứng dụng cần chúng. Thay vì yêu cầu dịch vụ của bạn gọi riêng tập lệnh bash cài đặt môi trường và ứng dụng, hãy để dịch vụ của bạn gọi tập lệnh bash đặt các biến môi trường sau đó khởi chạy ứng dụng.

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

Từ những gì tôi đã đọc trực tuyến, có những hack (một cái gì đó phải làm với eval trên tập lệnh nguồn hoặc sử dụng gdb) để làm cho nó hoạt động. Tôi không quá quan tâm đến việc nó ở trong nền, nếu tôi có thể chạy các lệnh trong "shell" hiện tại (bạn có ở trong trình bao khi khởi động khi dịch vụ của bạn đang thực thi không?) Thì điều đó cũng tốt.
sqenixs

Thật không may, tôi không thể khởi động ứng dụng khỏi dịch vụ, vì có nhiều quy trình khác nhau được khởi động và những thứ được cấu hình từ tập lệnh khởi động ứng dụng và chúng phải được tách biệt khỏi dịch vụ cho IA.
sqenixs

@sqenixs Một vỏ là một quá trình như bất kỳ khác. Không có thứ gì như là ở trong một vỏ sò. Khi bạn nói về eval eval trên tập lệnh nguồn, đó là một giao thức trong đó một chương trình (có thể không phải là tập lệnh shell) in ra các định nghĩa theo cú pháp shell và tập lệnh shell diễn giải chúng. Đặt các biến môi trường với gdb có thể hoạt động hoặc nó không có tác dụng hoặc có thể làm hỏng ứng dụng của bạn; như bạn có thể tưởng tượng, sử dụng trình gỡ lỗi trong sản xuất không được khuyến nghị (và, một lần nữa, vì lý do chính đáng).
Gilles 'SO- ngừng trở nên xấu xa'

Có lẽ có một giải pháp cho vấn đề của bạn, nhưng bạn cần chính xác hơn với yêu cầu của mình. Trong câu hỏi của bạn, bạn viết ra sau khi tập lệnh chạy dịch vụ, sau đó gọi một tập lệnh khác khởi động một ứng dụng. Vì vậy, bạn dường như có một giải pháp: đặt các biến môi trường bên trong tập lệnh khác đó. Nhưng sau đó, trong một bình luận bạn viết rằng bạn không thể khởi động ứng dụng từ dịch vụ. Vì vậy, đó là gì?
Gilles 'SO- ngừng trở nên xấu xa'

có lẽ, tạo hoặc cấu hình môi trường của / sbin / init tại thời điểm khởi động. Vì mọi tiến trình đều là con của init anyways, tiến trình con có thể có được môi trường. Chỉ là một suy nghĩ / đoán.
Nikhil Mulley
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.