스크립트를 통해 부팅 할 때 전역 환경 변수를 설정하고 로그인하기 전에 실행되는 응용 프로그램에 사용할 수있는 방법은 무엇입니까?


17

부팅시 실행되는 서비스가 있으며 해당 서비스에서 일부 환경 변수를 내보내는 백그라운드에서 bash 스크립트를 호출합니다. 내가 겪고있는 문제는 해당 환경 변수가 백그라운드 프로세스의 부모에게 보내지지 않아 스크립트 실행이 완료되면 사라집니다.

또한 스크립트가 실행 된 후 서비스가있는 응용 프로그램을 시작하는 다른 스크립트를 호출합니다. 이 응용 프로그램은 해당 환경 변수에 액세스해야합니다.

내가 실행하는 RHEL 시스템은 사용자가 절대로 로그인하지 않으며 부팅 및 응용 프로그램 만 시작합니다. 부모 프로세스 / 셸의 환경 변수는 실제로 자식 백그라운드 프로세스 셸에서 설정할 수 없다는 것을 알고 있습니다.

내 서비스에서 호출하지 않는 스크립트를 통해이 작업을 수행 할 수있는 방법이 필요합니다 (필자는 백그라운드는 아니지만). 내 서비스에 추가하지 않고 (나에게도 효과가 없었습니다) /etc/environment또는 .profile또는 그와 같은 것.

내 서비스에서 환경 변수를 추가하려고했습니다 (하지만 원하는 것은 아닙니다).

    export TEST=192.168.1.1

나는 또한 내 서비스에서 이것을 시도했다.

    TEST=192.168.1.1
    export TEST=${TEST}

서비스가 bash 스크립트를 호출하는 방식을 변경하려고했습니다.

    /bin/asdf/script &

또한 스크립트를 소싱하여 동일한 쉘에서 실행되도록 시도했습니다 ( 이것 으로부터 얻었습니다 ).

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

나는 또한 발견 흥미로운 보았다 어떤을하지만 정말 내 경우에서 이동하지 않았다.

답변:


12

변수를 수집하는 스크립트를 넣을 수 있습니다. /etc/profile.d/

예:

/etc/profile.d/somescript.sh

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

/etc/profile에서 스크립트를 실행하는 호출을 수행 /etc/profile.d/하며 이는 루트를 포함하여 시스템의 모든 사용자에게 적용됩니다.


당신은 여기에 뭔가있을 수 있습니다. IA 이유로 인해 스크립트를 / etc 디렉토리에 찾을 수 없기 때문에 정확히 그렇게하고 싶지 않습니다. 그러나 스크립트를 가리키는 심볼릭 링크를 만들 수 있다고 생각합니다. 그러나 복잡하게하기 위해 스크립트에서 설정 한 일부 환경 변수는 서비스에서 설정 한 환경 변수에서 나옵니다. 따라서 서비스 스크립트가 끝나기 전에 변수를 미리 설정해야하지만 너무 빠르지 않거나 필요한 환경 변수가 아직 서비스에 의해 작성되지 않았기 때문에 이것은 작동하지 않을 수 있습니다.
sqenixs

서비스에 설정된 변수에 대한 종속성을 제거 할 수 있다고 생각합니다. 이 경우 서비스가 시작되기 전에 스크립트가 실행되는 한 작동한다고 생각합니다. 로그인 쉘이 언제 시작되는지 아십니까? 또는 로그인 쉘이 시작되는시기를 제어 할 수 있습니까? 내 실행 수준에 대한 rcX.d 디렉토리에 서비스가 없습니다.
sqenixs

1

프로세스가 다른 기존 프로세스의 환경에 영향을 줄 수있는 방법은 없습니다. 프로세스는 자식 프로세스의 환경에만 영향을줍니다.

따라서 이러한 환경 변수는 필요한 응용 프로그램의 조상에서 설정해야합니다. 서비스가 환경 설정 bash 스크립트와 응용 프로그램을 개별적으로 호출하도록하는 대신 서비스가 환경 변수를 설정 한 다음 응용 프로그램을 시작하는 bash 스크립트를 호출하게하십시오.

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

내가 온라인에서 읽은 것부터 작동하기 위해 해킹 (소스 스크립트에서 eval과 관련이 있거나 gdb 사용)이 있습니다. 나는 현재 "쉘"에서 명령을 실행할 수 있다면 (서비스가 실행될 때 쉘에 있습니까?) 백그라운드에 있다는 것에 지나치게 관심이 없습니다.
sqenixs

불행히도, 시작된 많은 다른 프로세스와 응용 프로그램 시작 스크립트에서 구성된 것들이 있으므로 IA의 서비스와 별도로 유지되어야하므로 서비스에서 응용 프로그램을 시작할 수 없습니다.
sqenixs

@sqenixs 쉘은 다른 프로세스와 같습니다. "껍질 속에있는 것"과 같은 것은 없습니다. "소스 스크립트의 평가"에 대해 말할 때, 이는 프로그램 (쉘 스크립트가 아닐 수도 있음)이 쉘 구문으로 정의를 인쇄하고 쉘 스크립트가 해석하는 프로토콜입니다. gdb를 사용하여 환경 변수를 설정하면 효과가 없거나 효과가 없거나 응용 프로그램이 중단 될 수 있습니다. 상상할 수 있듯이 프로덕션 환경에서 디버거를 사용하는 것은 권장되지 않습니다 (다시 한 이유로).
Gilles 'SO- 악의를 그만두십시오'12

문제에 대한 해결책이있을 수 있지만 요구 사항에 대해보다 정확해야합니다. 귀하의 질문에, "스크립트가 실행 된 후 서비스를 시작한 다음 응용 프로그램을 시작하는 다른 스크립트를 호출합니다"라고 씁니다. 그래서 당신은 해결책을 가지고있는 것 같습니다 : 다른 스크립트 안에 환경 변수를 설정하십시오. 그러나 코멘트에서 당신은 "서비스에서 응용 프로그램을 시작할 수 없습니다"라고 씁니다. 그래서, 그것은 무엇입니까?
Gilles 'SO- 악마 그만해'12

부팅시 / sbin / init 환경을 만들거나 구성 할 수 있습니다. 어쨌든 모든 프로세스는 초기화의 자식이므로 자식 프로세스는 환경을 획득 할 수 있습니다. 그냥 생각 / 추측.
Nikhil Mulley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.