비대화형 세션에서 환경 채우기

비대화형 세션에서 환경 채우기

저는 Yocto Poky를 배포판으로 실행하는 임베디드 장치를 개발 중입니다.

최종 제품에는 에 의해 시작되는 여러 응용 프로그램이 있습니다 SysVinit. 사용자 는 한 명뿐입니다 root.

우리 응용 프로그램에 필요한 일부 환경 변수를 추가하는 /etc/init.d몇 가지 스크립트가 있습니다 . /etc/profile.d내가 직면하고 있는 문제는 앱을 "손으로" 실행하면(대화형 셸이 있음) 의 스크립트가 /etc/profile.d/소스로 제공되었기 때문에 잘 실행되지만 로 실행하면 SysVinit채워진 환경을 찾을 수 없다는 것입니다(분명히 ). 우리는 sh쉘로 사용하고 있습니다.

.bashrc와 같은 다른 파일과 및 과 .profile같은 일부 변수 에 대해 읽었습니다 . 거기에 변수를 정의하려고 했지만 운이 없었습니다. 내가 찾은 작은 해결 방법은 로그인 셸(에서 )에서 기본 애플리케이션을 시작하는 것입니다.ENVBASH_ENVSysVinit

2:12345:once:/bin/sh -lc /usr/bin/my_app

그래서 내 질문은 다음과 같습니다

  1. 부팅하는 동안(로그인하지 않고) 환경을 설정하거나 SysVinit좋은 방법으로 설정하려면 어떻게 해야 합니까?
  2. 스크립트 에서 수행된 내보내기는 /etc/init.d내 환경에 전혀 전파되지 않습니다. 그 이유는 해당 스크립트가 하위 쉘에서 실행되고 현재 스크립트에서 소스가 제공되지 않기 때문입니다(로그인 2가 필요함). 그렇다면 거기에서 변수를 어떻게 내보낼 수 있습니까?
  3. 내 해결 방법이 유효한 솔루션입니까?

답변1

  1. 부팅하는 동안(로그인하지 않고) 환경을 설정하거나 SysVinit에서 환경을 설정하도록 하려면 어떻게 해야 합니까?

부팅하는 동안 환경은 깨끗합니다(초기화되지 않은 제트기). 서비스가 스크립트인 경우 source또는 .명령을 통해 환경 변수를 넣거나 프로그램에서 초기화해야 합니다 (예: 구성 파일을 통해).sh

서비스 스크립트 헤더의 작은 예:

#!/bin/bash

[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh

. . .
  1. /etc/init.d 스크립트에서 수행된 내보내기는 내 환경에 전혀 전파되지 않습니다. 그 이유는 해당 스크립트가 하위 쉘에서 실행되고 현재 스크립트에서 소스가 제공되지 않기 때문입니다(로그인 2가 필요함). 거기에서 변수를 내보내나요?

source서브쉘에 대한 env 변수 또는 지정된 env 변수를 사용하여 명령을 호출합니다.

서비스 스크립트 헤더의 작은 예:

#!/bin/bash

. . .

$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)

. . .
  1. 내 해결 방법이 유효한 솔루션입니까?

그것이 일이라면 서비스에 있어서는 더러운 방법입니다. 1. 및 2를 참조하십시오.

관련 정보