유닉스에서 실행중인 프로세스의 환경 변수?


231

유닉스 시스템의 환경 변수와 관련된 일부 문제를 해결해야합니다.

Windows에서는 ProcessExplorer와 같은 도구를 사용하여 특정 프로세스를 선택하고 각 환경 변수의 값을 볼 수 있습니다.

유닉스에서 어떻게 똑같은 일을 할 수 있습니까? echoing그리고 envcmd를 단지 현재의 값을 표시,하지만 난 실행중인 프로세스가 현재 사용하고있는 값 무엇을 보려는.


2
/ proc / <pid> / environ의 크기는 0이지만 여전히 정보가 있습니다. "커널의 창으로 생각하면 더 의미가 있습니다. 파일에는 실제로 데이터가 포함되어 있지 않으며 실제 프로세스 정보가있는 위치에 대한 포인터 역할 만합니다." [source ]
nevets1219

답변:


295
cat /proc/<pid>/environ

주어진 실행중인 실행 파일에 대해 pid를 원한다면 여러 가지 가능성 중에서 다음을 사용할 수 있습니다 pidof.

AlberT$ pidof sshd   
30690 6512 

편집 :

더 읽기 쉬운 출력을 달성하기 위해 Dennis WilliamsonTeddy의 의견을 전적으로 인용 합니다. 내 해결책은 다음과 같습니다.

tr '\0' '\n' < /proc/<pid>/environ

46
읽을 수 있도록 널을 개행 문자로 변환하십시오.cat /proc/17330/environ | tr \\0 \\n
Dennis Williamson

32
나는 항상xargs --null --max-args=1 echo < /proc/PID/environ
Teddy

7
빠른 문자열을 사용하는 것이 좋습니다. 고양이는 여전히 빠릅니다 :-)
Nikhil Mulley

3
전체 /proc파일 시스템은 이식성이 없습니다.
Daniel H

6
xargsnull을 개행 문자로 변환 하는 데 사용 하는 것이을 사용 하는 것보다 나은 이유를 이해하지 못합니다 tr. 누군가 나를 위해 그것을 배치 할 수 있습니까? 감사.
Jonathan Hartley

61

이 질문에는 유닉스 태그가 있고 다른 모든 사람들이 리눅스 태그를 다루는 훌륭한 일을 했으므로 OS X 및 다른 BSD 파생 시스템 에서이 정보를 얻을 수 있습니다

ps -p <PID> -wwwe

또는

ps -p <PID> -wwwE

와 함께 Solaris에서

/usr/ucb/ps -wwwe <PID>

/proc모호한 ps명령 을 기억하지 않으려는 경우 Solaris는 디렉토리를 지원합니다 .


3
II 실행 PS -p <PID> -wwwe OS X 10.6에 내가 실행중인 모든 프로세스의 목록을 가져옵니다. 올바른 명령은 -e 가 아니라 -E 플래그입니다.
drAlberT

1
OS X 10.4에서 테스트했지만 10.5는 테스트하지 않았습니다. 이에 따라 업데이트되었습니다.
Gerald Combs

4
이것은 완벽하지 않습니다. -E 옵션은 초기 환경 변수 만보고 합니다. 실행중인 프로세스 자체에 의해 변수가 변경된 경우 (예 : POSIX putenv () 함수 사용) 변경 사항은의 출력에 반영되지 않습니다 ps -p <PID> -wwE.
Kal

1
자신이 소유하지 않은 환경의 프로세스를 보지 않으면 바람직한 기능처럼 들립니다. @drAlberT의 Linux 지향 답변을 사용하는 경우도 있습니다 /proc/PID/environ. 해당 파일은 프로세스 소유자 만 읽을 수 있습니다.
Jonathan Hartley

1
@yani 가능하지만 훨씬 어렵습니다. 실행중인 프로세스에 디버거를 연결해야합니다. 이 답변 참조 : unix.stackexchange.com/a/70636
Kal

25

다른 사람들이 언급했듯이 Linux에서는 / proc를 볼 수 있지만 커널 버전에 따라 한두 가지 제한이 있습니다.

우선, 환경 파일에는 프로세스가 생성되었을 때의 환경이 포함되어 있습니다. 즉, 프로세스가 환경에 대해 변경 한 내용은 / proc에 표시되지 않습니다.

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$ 

첫 번째 쉘은 로그인 쉘이며 처음에는 환경이 매우 제한되어 있지만 .bashrc를 소싱하여 환경을 확장하지만 / proc는 이것을 반영하지 않습니다. 두 번째 쉘은 처음부터 더 큰 환경을 상속하므로 / proc에 표시됩니다.

또한 이전 커널에서 environ 파일의 내용은 페이지 크기 (4K)로 제한됩니다.

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$ 

2.6.9 (RHEL4)와 2.6.18 (RHEL5) 사이에이 제한이 제거되었습니다 ...


1
프로세스가 생성 된 후에 설정된 원격 프로세스의 환경 변수를 얻을 수 있습니까? VFS에서는 / proc / self / environ과 함께 표시되지만 프로세스 내부에있는 경우에만 표시됩니다. 그러나 원격 프로세스를 위해 이것을 얻는 방법은 무엇입니까?
GP92

11

이를 위해 BSD 옵션을 올바르게 사용하십시오 (적어도 리눅스에서는).

ps e $pid

또는

ps auxe  #for all processes

그리고 네, ps 맨 페이지는 꽤 혼란 스럽습니다. ( 를 통해 )


내 우분투는 환경 변수를 사이에 공간이 없어도 명령 줄에 대해 스매시하고 터미널 창에서 한 줄로 자릅니다. 내가 발견 ps eww $pid수정에게 두번째 문제.
user18911

1
@ user18911 : env vars에는 null 문자 구분 기호가 있습니다. 이 페이지의 다른 답변 은 가독성을 높이기 위해 이를 사용 xargs하거나 tr개행 문자로 변환하는 방법을 보여줍니다 . 당신은 아마 4 년 동안 이것을 깨달았습니다.
Jonathan Hartley

7
cat /proc/PID/environ

PID를보고자하는 프로세스의 PID로 교체하십시오. 실행중인 프로세스에 대한 모든 정보는 / proc / PID / 디렉토리에 있습니다.

예 : cat / proc / 32512 / environ


7

Archlinux 위키 에서 가져온 것 :

의 값을 구문 분석하는 임시 함수를 만들 수 있습니다 /proc/<pid>/environ. 터미널 프롬프트에서 :

envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }

그런 다음 원하는 프로세스의 pid로 다음을 사용하십시오.

envof <pid>

6

리눅스에서, 나는 살펴 보려고 노력했다.

/proc/<pid>/environ


5

다소 드물게 문서화되었지만 내용은 /proc/<pid>/environ프로세스를 시작하는 데 사용 된 환경 만 포함합니다.

프로세스 환경의 현재 상태를 검사해야하는 경우이를 수행하는 한 가지 방법은을 사용하는 것 gdb입니다.

# Start gdb by attaching it to a pid or core file
gdb <executable-file> <pid or core file>

# Run the following script to dump the environment
set variable $foo = (char **) environ
set $i = 0
while ($foo[$i] != 0)
print $foo[$i++]
end

3

그리고 저의 직업으로 인해 AIX 팬이되었습니다.

ps eww [pid]

또는 매뉴얼 페이지에서 "버클리 표준"이라고합니다.

어떤 이유로 든 / proc / PID / environ은 AIX에 존재하지 않습니다.


2

env임의의 프로세스 (PID)에 대한 환경 변수 출력과 같은 형식화 된 형식을 작성하려는 경우 편리한 bash penv <pid>명령 (OS에 맞게 조정)을 작성하여 .bashrc다음에 추가 할 수 있습니다 .

리눅스는 이것을 ~ / .bashrc에 추가하십시오 :

penv () { 
    xargs --null --max-args=1 < /proc/$1/environ
}

macOS / BSD는 이것을 ~ / .bashrc에 추가합니다 :

penv() {
   ps eww -o command $1  | tr ' ' '\n'
}

Solaris는 이것을 ~ / .bashrc에 추가합니다 :

penv() {
   pargs -e $1
}

용법:

$ 소스 $ HOME / .bashrc
$ pgrep VBoxSVC
10268
펜브 10268
SSH_CONNECTION = 1.1.1.242 53960 1.1.1.91 22
GREP_COLORS = sl = 49; 39 : cx = 49; 39 : mt = 49; 38; 5; 167; 1 : fn = 49; 39; 1 : ln = 49; 39 : bn = 49; 39 : se = 50; 39
LANG = ko_KR.UTF-8
에디터 = vim
XDG_SESSION_ID = 106
USER = 루트
PWD = / 루트
HOME = / 루트
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / pts / 3
MAIL = / var / mail / root
TERM = xterm-256 색
쉘 = / bin / bash
SHLVL = 1
LOGNAME = 루트
DBUS_SESSION_BUS_ADDRESS = unix : path = / run / user / 0 / bus
XDG_RUNTIME_DIR = / run / user / 0
PATH = / root / bin : / bin : / sbin : / usr / bin : / usr / sbin : / usr / local / bin : / usr / local / sbin :.
VBOX_LOG_FLAGS = 스레드 tsc
VBOX_LOG = -all + dev_vmm_backdoor.elf + dev_vmm.elf

0

맥 솔루션, 아마도 다른 BSD들도

pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-

환경 변수가 명령 행에 추가됩니다. 그러면 명령 행이 제거되고 환경 변수 만 남습니다.

공간이 분리되어 있기 때문에 완벽하지 않습니다.


-1

/ proc / PID / 환경

이를 위해 먼저 프로세스의 PID를 식별해야합니다. 이를 위해 ps 명령을 사용할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.