Buộc launchd đọc lại các biến môi trường


4

Có cách nào, thiếu khởi động lại, để buộc launchdđọc lại các biến môi trường mới được xác định trong /etc/launchd.confkhông?

Nó có thể được thực hiện với launchctl(1)?

Câu trả lời:


2

Không có cách nào để làm điều này, "launchd" là quy trình tổng thể, tương đương với "init" trong các hệ thống unix khác, cách duy nhất trong bất kỳ trình nền nào khác là thực hiện một số loại kill -HUP để tải lại các tệp cấu hình, v.v. nhưng hoạt động này không được phép trên launchd. Nếu bạn tra cứu nó trong bảng quy trình thì đó là quy trình số 1, mọi quy trình khác hiện đang chạy đều theo cách nào đó là con của nó, vì vậy khởi động lại là cách duy nhất để đạt được điều này. Bạn có thể có thêm may mắn trong việc thiết lập các biến môi trường đó trong một khu vực khác có xu hướng cho phép khởi động lại.

    Dans-iMac:etc stuffe$ ps -ef | grep launchd | grep -v grep
    0     1     0   0  9:40am ??         0:09.47 /sbin/launchd
   65    18     1   0  9:40am ??         1:53.64 /usr/sbin/mDNSResponder -launchd
  213    73     1   0  9:41am ??         0:02.55 /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd -launchd
    0    85     1   0  9:41am ??         0:00.08 /System/Library/CoreServices/ODSAgent.app/Contents/MacOS/ODSAgent -launchd
   89   230     1   0  9:41am ??         0:00.01 /sbin/launchd
  501   238     1   0  9:41am ??         0:00.23 /sbin/launchd
  501   933   238   0 10:53am ??         0:00.01 /System/Library/CoreServices/AirPort Base Station Agent.app/Contents/MacOS/AirPort Base Station Agent -launchd -allowquit

BIÊN TẬP:

Tất nhiên, thiếu giải pháp rõ ràng là bạn có thể thêm các biến có liên quan vào tệp cấu hình, sau đó chỉ cần chạy các lệnh theo cách thủ công để thoát khỏi nhu cầu khởi động lại, không có gì mà chỉ các chương trình mới bắt đầu sẽ tính đến mọi thay đổi. Tôi tìm thấy này trang mà giải thích nó một cách chi tiết hơn:

Các biến môi trường được đặt trong launchd sẽ có sẵn cho tất cả các chương trình trên hệ thống. Tuy nhiên, vì $ HOME / .launchd.conf không được hỗ trợ, phương pháp này chỉ được sử dụng cho các biến môi trường toàn cầu.

Tệp /etc/launchd.conf chứa danh sách các lệnh sẽ được chạy bởi launchctl trong khi khởi động. Tuy nhiên, các biến môi trường được đặt trong /etc/launchd.conf không thể có khoảng trắng và không thể tham chiếu các biến môi trường khác; launchctl khi chạy trong Terminal không chịu những hạn chế này. Xin lưu ý rằng /etc/launchd.conf không tồn tại theo mặc định, vì vậy chúng tôi sẽ cần tạo nó.

Việc khởi động lại là cần thiết để tải nội dung của /etc/launchd.conf. Tuy nhiên, nếu bạn đã chạy launchctlcommands tương ứng trong Terminal, bạn có thể giảm bớt nhu cầu khởi động lại. Chỉ cần nhớ rằng nếu bạn chỉ thực hiện các lệnh launchctl và không đặt các mục trong /etc/launchd.conf, nó sẽ không tồn tại sau khi khởi động lại.

Nếu bạn muốn có một biến môi trường toàn hệ thống sử dụng khoảng trắng hoặc phụ thuộc vào biến môi trường khác, bạn có thể đặt các lệnh launchctl vào một trong các tệp mà Terminal đọc. Bạn sẽ phải thoát và khởi chạy lại Terminal để truy cập các biến mới được đặt.


1

Có, bạn có thể sử dụng launchctl để thêm chúng cho bạn.

ví dụ từ thiết bị đầu cuối:

grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl

đầu ra trên máy của tôi:

 launchctl setenv _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true
 launchctl setenv JMETER_HOME /Applications/apache-jmeter-2.10
 lauchctl setenv GRADLE_HOME /usr/local/gradle-2.0

Sau đó, bạn có thể khởi động lại bất cứ ứng dụng nào cần nó tạo thành spotlight


Làm tốt lắm @Peter. 3 năm 9 tháng sau, điều này làm việc như một nhà vô địch.
tim.rohrer
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.