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

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

저는 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내 환경에 전혀 전파되지 않습니다. 이는 이러한 스크립트가 하위 쉘에서 실행되고 현재 스크립트 내에서 가져오지 않기 때문입니다(두 번 로그인해야 함). 그렇다면 어디에서 변수를 내보내나요? ?
  3. 내 해결 방법이 유효한 솔루션입니까?

답변1

  1. 시작하는 동안(로그인 없이) 환경을 설정하거나 SysVinit가 좋은 방법으로 환경을 설정하도록 하려면 어떻게 해야 합니까?

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

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

#!/bin/bash

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

. . .
  1. /etc/init.d 스크립트에서 수행된 내보내기는 내 환경에 전혀 전파되지 않습니다. 이는 이러한 스크립트가 현재 스크립트(두 번 로그인해야 함)에서 가져오는 대신 하위 쉘에서 실행되기 때문입니다. 그러면 거기에서 변수를 어떻게 내보낼 수 있나요?

source서브셸의 env 변수를 사용하거나 지정된 env 변수를 사용하여 명령을 호출합니다.

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

#!/bin/bash

. . .

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

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

이것이 일이라면 이것은 더러운 봉사 방법입니다. 1과 2를 참조하세요.

관련 정보