시작, 백그라운드 및 서비스 프로세스에 어떤 환경과 자격 증명이 사용됩니까?

시작, 백그라운드 및 서비스 프로세스에 어떤 환경과 자격 증명이 사용됩니까?
  • 시작 스크립트(시작 시)
  • 백그라운드에서 실행 중인(또는 전송된) 프로세스(예: SSH -fN 사용 시)
  • 제공하다
  • 등.

그들은 어떤 $path 변수를 사용할 것인가? 어떤 문서? 제가 알아야 할 다른 것이 있나요?

인터넷 검색을 시도하고 포럼에서 흩어져 있는 많은 정보를 찾았지만 무슨 일이 일어나고 있는지에 대한 명확하고 완전한 설명을 제공하는 정보는 없습니다.

참고로 저는 Debian과 거의 동일한 Raspbian을 실행하고 있습니다.

답변1

프로세스가 시작되는 단계에 따라 환경 변수가 전혀 없을 수도 있고, 상위 프로세스에서 상속받을 수도 있고, 시작(init.d) 스크립트의 변수를 사용할 수도 있습니다.

다음을 확인하여 프로세스에 어떤 환경 변수가 있는지 확인할 수 있습니다 /proc/$PID_OF_PROCESS/environ.

root@frisbee:~# xargs -n 1 -0 < /proc/1243/environ 
UPSTART_INSTANCE=
UPSTART_JOB=rsyslog
TERM=linux
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
UPSTART_EVENTS=filesystem
PWD=/

해당 디렉토리를 조사하면 프로세스에 대한 많은 정보를 찾을 수 있습니다 /proc/. 예를 들어:

  • 프로세스의 현재 작업 디렉터리는 다음과 심볼릭 링크되어 있습니다 /proc/$PID/cwd.

    root@frisbee:~# ls -l /proc/1243/cwd
    lrwxrwxrwx 1 root root 0 apr 30 11:20 /proc/1243/cwd -> /
    
  • 프로세스가 있는 바이너리에 대한 심볼릭 링크는 exec()다음과 같습니다 /proc/$PID/exe.

    root@frisbee:~# ls -l /proc/1243/exe
    lrwxrwxrwx 1 root root 0 apr 30 11:19 /proc/1243/exe -> /usr/sbin/rsyslogd
    
  • 파일 설명자(파일 + 네트워크 연결 + 프로세스 간 통신 소켓)는 다음에서 찾을 수 있습니다 /proc/$PID/fd/.

    root@frisbee:/proc/1243/fd# ls -l
    total 0
    lrwx------ 1 root root 64 apr 30 11:20 0 -> socket:[12362]
    l-wx------ 1 root root 64 apr 30 11:20 1 -> /var/log/syslog
    l-wx------ 1 root root 64 apr 30 11:20 2 -> /var/log/kern.log
    lr-x------ 1 root root 64 apr 30 11:20 3 -> /proc/kmsg
    l-wx------ 1 root root 64 apr 30 11:20 4 -> /var/log/auth.log
    l-wx------ 1 root root 64 apr 30 11:39 5 -> /var/log/ufw.log
    

ps출력을 검사하여 프로세스가 어떤 사용자로 실행되고 있는지 확인할 수 있습니다.

root@frisbee:/proc/1243# ps -fp 1243
UID        PID  PPID  C STIME TTY          TIME CMD
syslog    1243     1  0 11:19 ?        00:00:01 rsyslogd -c5

제가 알아야 할 다른 것이 있나요?

많이 있지만, 이러한 것들을 직접 정의하고 찾아보거나 다른 관련 질문을 해야 합니다.

답변2

시작 스크립트(시작 시)

프로세스 시작 날짜내부에대개 거의 없거나 전혀 없음기존의환경이지만 호출 방법에 따라 다릅니다.

직접 호출되는 경우, 즉 init 데몬에 의해 분기 및 실행되는 경우에는 $PATH설정되지 않습니다. 셸을 통해 호출되는 경우 $PATH셸 및 구성 방법에 따라 설정할 수 있지만 일반적으로 여전히 설정되지 않으므로 init 스크립트에 일반적으로 전체 경로가 포함됩니다.

이와 같은 환경 변수는 $PATH일반적으로 쉘 스크립트에 설정되며 쉘이 시작될 때 자동으로 얻을 수 있습니다. 이를 수행하는 방법에 대한 지침은 Bash의 INVOCATION을 참조하세요 man bash. 비대화형으로 호출된 쉘 sh(즉, 대부분의 init 스크립트)의 경우 자동으로 얻은 파일이 없습니다.

환경 변수도 상속되지만 init(시스템의 첫 번째 프로세스)가 일부 환경 변수를 설정하지 않는 한 하위 프로세스(예: init 스크립트 실행)는 아무것도 상속하지 않습니다.

특정 부팅 서비스에서 특정 방식으로 환경을 설정해야 하는 경우 해당 환경을 자체적으로 설정하는 것은 해당 서비스의 책임입니다. 전통적으로 이는 init 스크립트에서 변수를 초기화하여 수행됩니다.

백그라운드에서 실행 중인(또는 전송된) 프로세스

프로세스는 상위 프로세스(프로세스를 시작한 프로세스)로부터 환경을 상속받습니다. 백그라운드로 보내도 변경되지 않습니다.

관련 정보