it-swarm-ko.tech

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

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

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

유닉스에서 어떻게 똑같은 일을 할 수 있습니까? echoingenv cmd는 현재 값을 표시하지만 실행중인 프로세스가 현재 사용중인 값을보고 싶습니다.

235
m3rLinEz
cat /proc/<pid>/environ

주어진 실행 파일의 pid (들)을 원한다면, 여러 가능성 중에서 pidof를 사용할 수 있습니다 :

AlberT$ pidof sshd   
30690 6512 

편집 :

더 읽기 쉬운 출력을 얻으려면 Dennis WilliamsonTeddy 주석을 완전히 인용하십시오. 내 해결책은 다음과 같습니다.

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

이 질문에는 nix 태그가 있고 다른 모든 사람들은 linux 태그와 같은 훌륭한 작업 주소 지정을 수행 했으므로 OS X 및 기타 BSD 파생 시스템에서이 정보를 얻을 수 있습니다.

ps -p <PID> -wwwe

또는

ps -p <PID> -wwwE

와 함께 Solaris에서

/usr/ucb/ps -wwwe <PID>

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

63
Gerald Combs

다른 사람들이 언급했듯이 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) 사이에이 제한이 제거되었습니다 ...

25
Lasse

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

ps e $pid

또는

ps auxe  #for all processes

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

11
raincrumb

다소 희박하게 문서화되었지만 /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
7
Michael Renner
cat /proc/PID/environ

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

예 : cat/proc/32512/environ

7
kargig

Archlinux wiki 에서 가져온 것 :

/proc/<pid>/environ의 값을 구문 분석하기위한 임시 함수를 작성할 수 있습니다. 터미널 프롬프트에서 :

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

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

envof <pid>
7
mwotton

Solaris 5.10의 경우 다음과 같이 작동합니다.

pargs -e <PID>
6
Mykola Novik

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

/proc/<pid>/environ
6
Joril

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

ps eww [pid]

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

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

4
Corey S.

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

Linux 이것을 ~/.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 
 $ penv 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 = en_US.UTF-8 
 EDITOR = vim 
 XDG_SESSION_ID = 106 
 USER = root 
 PWD =/root 
 HOME =/root 
 SSH_CLIENT = 1.1.1.242 53960 22 
 SSH_TTY =/dev/pts/3 
 MAIL =/var/mail/root 
 TERM = xterm-256color 
 쉘 =/bin/bash 
 SHLVL = 1 
 LOGNAME = root 
 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 
3
clearlight

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

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

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

공백으로 분리되어 있기 때문에 완벽하지 않습니다 LF 분리됨

0
Erik Martino