저는 Yocto Poky를 배포판으로 실행하는 임베디드 장치를 개발 중입니다.
최종 제품에는 에서 실행되는 여러 애플리케이션이 포함됩니다 SysVinit
. 사용자 는 단 한 명뿐입니다 root
.
우리 애플리케이션에 필요한 일부 환경 변수를 /etc/init.d
추가하는 스크립트가 있습니다 . /etc/profile.d
내가 직면한 문제는 응용 프로그램을 "수동으로" 실행하면(대화형 셸이 있음) 스크립트가 /etc/profile.d/
소스로 제공되기 때문에 제대로 실행되지만 실행 시 SysVinit
채워진 환경을 찾을 수 없다는 것입니다(분명히). 우리는 sh
쉘을 사용하고 있습니다.
.bashrc
와 같은 다른 파일 과 및 와 .profile
같은 일부 변수를 읽었습니다 . 거기에 변수를 정의하려고 시도했지만 운이 없었습니다. 내가 찾은 작은 해결 방법은 로그인 셸(에서 )에서 기본 애플리케이션을 시작하는 것이었습니다.ENV
BASH_ENV
SysVinit
2:12345:once:/bin/sh -lc /usr/bin/my_app
그래서 내 질문은 다음과 같습니다
- 시작하는 동안 환경을 설정하거나(로그인이 필요하지 않음)
SysVinit
좋은 방법으로 완료하려면 어떻게 해야 합니까? - 스크립트 내에서 수행된 내보내기는
/etc/init.d
내 환경에 전혀 전파되지 않습니다. 이는 이러한 스크립트가 하위 쉘에서 실행되고 현재 스크립트 내에서 가져오지 않기 때문입니다(두 번 로그인해야 함). 그렇다면 어디에서 변수를 내보내나요? ? - 내 해결 방법이 유효한 솔루션입니까?
답변1
- 시작하는 동안(로그인 없이) 환경을 설정하거나 SysVinit가 좋은 방법으로 환경을 설정하도록 하려면 어떻게 해야 합니까?
시작하는 동안 환경이 깨끗합니다(젯이 초기화되지 않음). source
또는 명령 (서비스가 스크립트인 경우)을 통해 .
환경 변수를 배치하거나 프로그램에서 초기화(예: 구성 파일을 통해) 해야 합니다 .sh
서비스 스크립트 헤더의 작은 예:
#!/bin/bash
[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh
. . .
- /etc/init.d 스크립트에서 수행된 내보내기는 내 환경에 전혀 전파되지 않습니다. 이는 이러한 스크립트가 현재 스크립트(두 번 로그인해야 함)에서 가져오는 대신 하위 쉘에서 실행되기 때문입니다. 그러면 거기에서 변수를 어떻게 내보낼 수 있나요?
source
서브셸의 env 변수를 사용하거나 지정된 env 변수를 사용하여 명령을 호출합니다.
서비스 스크립트 헤더의 작은 예:
#!/bin/bash
. . .
$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)
. . .
- 내 해결 방법이 유효한 솔루션입니까?
이것이 일이라면 이것은 더러운 봉사 방법입니다. 1과 2를 참조하세요.