유닉스 시스템의 환경 변수와 관련된 일부 문제를 해결해야합니다.
Windows에서는 ProcessExplorer와 같은 도구를 사용하여 특정 프로세스를 선택하고 각 환경 변수의 값을 볼 수 있습니다.
유닉스에서 어떻게 똑같은 일을 할 수 있습니까? echoing
그리고 env
cmd를 단지 현재의 값을 표시,하지만 난 실행중인 프로세스가 현재 사용하고있는 값 무엇을 보려는.
유닉스 시스템의 환경 변수와 관련된 일부 문제를 해결해야합니다.
Windows에서는 ProcessExplorer와 같은 도구를 사용하여 특정 프로세스를 선택하고 각 환경 변수의 값을 볼 수 있습니다.
유닉스에서 어떻게 똑같은 일을 할 수 있습니까? echoing
그리고 env
cmd를 단지 현재의 값을 표시,하지만 난 실행중인 프로세스가 현재 사용하고있는 값 무엇을 보려는.
답변:
cat /proc/<pid>/environ
주어진 실행중인 실행 파일에 대해 pid를 원한다면 여러 가지 가능성 중에서 다음을 사용할 수 있습니다 pidof
.
AlberT$ pidof sshd
30690 6512
편집 :
더 읽기 쉬운 출력을 달성하기 위해 Dennis Williamson 과 Teddy의 의견을 전적으로 인용 합니다. 내 해결책은 다음과 같습니다.
tr '\0' '\n' < /proc/<pid>/environ
cat /proc/17330/environ | tr \\0 \\n
xargs --null --max-args=1 echo < /proc/PID/environ
/proc
파일 시스템은 이식성이 없습니다.
xargs
null을 개행 문자로 변환 하는 데 사용 하는 것이을 사용 하는 것보다 나은 이유를 이해하지 못합니다 tr
. 누군가 나를 위해 그것을 배치 할 수 있습니까? 감사.
이 질문에는 유닉스 태그가 있고 다른 모든 사람들이 리눅스 태그를 다루는 훌륭한 일을 했으므로 OS X 및 다른 BSD 파생 시스템 에서이 정보를 얻을 수 있습니다
ps -p <PID> -wwwe
또는
ps -p <PID> -wwwE
와 함께 Solaris에서
/usr/ucb/ps -wwwe <PID>
/proc
모호한 ps
명령 을 기억하지 않으려는 경우 Solaris는 디렉토리를 지원합니다 .
ps -p <PID> -wwE
.
/proc/PID/environ
. 해당 파일은 프로세스 소유자 만 읽을 수 있습니다.
다른 사람들이 언급했듯이 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) 사이에이 제한이 제거되었습니다 ...
이를 위해 BSD 옵션을 올바르게 사용하십시오 (적어도 리눅스에서는).
ps e $pid
또는
ps auxe #for all processes
그리고 네, ps 맨 페이지는 꽤 혼란 스럽습니다. ( 를 통해 )
ps eww $pid
수정에게 두번째 문제.
xargs
하거나 tr
개행 문자로 변환하는 방법을 보여줍니다 . 당신은 아마 4 년 동안 이것을 깨달았습니다.
Archlinux 위키 에서 가져온 것 :
의 값을 구문 분석하는 임시 함수를 만들 수 있습니다 /proc/<pid>/environ
. 터미널 프롬프트에서 :
envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }
그런 다음 원하는 프로세스의 pid로 다음을 사용하십시오.
envof <pid>
다소 드물게 문서화되었지만 내용은 /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
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