Linux Shell Basics: lsof를 사용하지 않고 즉시 파일 설명자 상태(리디렉션됨)를 확인하는 방법은 무엇입니까?

Linux Shell Basics: lsof를 사용하지 않고 즉시 파일 설명자 상태(리디렉션됨)를 확인하는 방법은 무엇입니까?

나는 배우고 있다파일 설명자Linux의 경우 표시할 명령어가 있는지 알고 싶습니다.전체 목록이게 나한테 알려줘각각은 어디로 리디렉션되나요?지금 이 순간까지.
아마도 다음과 같은 정보가 있을 것입니다:

0  -->  <stdin
1  -->  >stdout
2  -->  >stderr
3  -->  >MyFileForWriting
4  -->  <MyFileForReading

내가 찾았어이 스레드이는 필수이지만 lsof이 명령이 있는 경우 이 명령에 의존하지 않는 다른 방법을 사용하는 것이 유용할 수 있습니다.
Linux에 대한 정보가 필요합니다(지금까지 "lsof" 도구는 포함하지 않았지만 대부분 POSIX 호환 OS처럼 작동하는 CygWin도 사용해 보겠습니다).

답변1

파일 /proc시스템에는 정확히 다음 정보가 나열됩니다.

$ ls -l /proc/self/fd
total 0
lrwx------ 1 michas users 1 Apr  6 04:44 0 -> /dev/pts/0
lrwx------ 1 michas users 1 Apr  6 04:44 1 -> /dev/pts/0
lrwx------ 1 michas users 1 Apr  6 04:44 2 -> /dev/pts/0
lr-x------ 1 michas users 1 Apr  6 04:44 3 -> /proc/6934/fd
$ ls -l /proc/self/fd 2>/dev/null <<<foo |cat
total 0
lr-x------ 1 michas users 1 Apr  6 04:45 0 -> /tmp/sh-thd-361068043 (deleted)
l-wx------ 1 michas users 1 Apr  6 04:45 1 -> pipe:[136729]
l-wx------ 1 michas users 1 Apr  6 04:45 2 -> /dev/null
lr-x------ 1 michas users 1 Apr  6 04:45 3 -> /proc/6952/fd

다른 프로세스에 관심이 있는 경우 "self"를 해당 PID로 바꾸면 됩니다.

답변2

@Patrick은 아래 설명에서 이러한 파일에 액세스하려면 기본이 아닌 커널 컴파일 시간 옵션이 필요함을 지적합니다. 나는 그 당시 이것을 깨닫지 못했고 지금까지 발견하지 못했습니다. 내 커널 패키지가 패키지 관리자를 통해 설치되었다는 것을 알고 있지만 적어도 하나의 배포판의 기본 빌드에 포함되어야 합니다. 따라서 특히 Cygwin이 관련된 경우 마일리지가 다를 수 있습니다.

최소한 포함하면 더 완전한 목록을 얻을 수 있다고 생각합니다./proc/self/map_files:

% sudo ls -al ${p=/proc/$$}/map_files | sudo sort -t\> -ubk2,2  

lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 400000-4a6000 -> /usr/bin/zsh
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e05aa3000-7f5e05ac3000 -> /usr/lib/ld-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04b88000-7f5e04b8c000 -> /usr/lib/libattr.so.1.1.0
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04d8d000-7f5e04f2b000 -> /usr/lib/libc-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e0589f000-7f5e058a3000 -> /usr/lib/libcap.so.2.24
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e0569b000-7f5e0569e000 -> /usr/lib/libdl-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e05135000-7f5e05235000 -> /usr/lib/libm-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e05436000-7f5e05496000 -> /usr/lib/libncursesw.so.5.9
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e0497c000-7f5e04987000 -> /usr/lib/libnss_files-2.19.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e05afa000-7f5e05c83000 -> /usr/lib/locale/locale-archive
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e0450c000-7f5e0452f000 -> /usr/lib/zsh/5.0.5/zsh/complete.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e038e0000-7f5e038ee000 -> /usr/lib/zsh/5.0.5/zsh/complist.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e036cb000-7f5e036db000 -> /usr/lib/zsh/5.0.5/zsh/computil.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e03cf3000-7f5e03cfc000 -> /usr/lib/zsh/5.0.5/zsh/parameter.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e03aef000-7f5e03af2000 -> /usr/lib/zsh/5.0.5/zsh/stat.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04101000-7f5e04103000 -> /usr/lib/zsh/5.0.5/zsh/terminfo.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04731000-7f5e04773000 -> /usr/lib/zsh/5.0.5/zsh/zle.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e03efe000-7f5e03f00000 -> /usr/lib/zsh/5.0.5/zsh/zleparameter.so
lr-------- 1 mikeserv mikeserv ? 64 Apr  5 21:07 7f5e04304000-7f5e0430b000 -> /usr/lib/zsh/5.0.5/zsh/zutil.so

이것은 정렬된 고유 목록입니다. 목록은 매우 유사해 보입니다.

% lsof -p ${p##*/}

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
zsh     23748 mikeserv  cwd    DIR    0,3        0 7800580 /proc/23748/map_files
zsh     23748 mikeserv  rtd    DIR   0,33      254     256 /
zsh     23748 mikeserv  txt    REG   0,33   705496 1281560 /usr/bin/zsh
zsh     23748 mikeserv  mem    REG   0,30          1281560 /usr/bin/zsh (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281593 /usr/lib/zsh/5.0.5/zsh/computil.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281592 /usr/lib/zsh/5.0.5/zsh/complist.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281579 /usr/lib/zsh/5.0.5/zsh/stat.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281576 /usr/lib/zsh/5.0.5/zsh/parameter.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281596 /usr/lib/zsh/5.0.5/zsh/zleparameter.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281582 /usr/lib/zsh/5.0.5/zsh/terminfo.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281587 /usr/lib/zsh/5.0.5/zsh/zutil.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281591 /usr/lib/zsh/5.0.5/zsh/complete.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1281595 /usr/lib/zsh/5.0.5/zsh/zle.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936654 /usr/lib/libnss_files-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30            23825 /usr/lib/libattr.so.1.1.0 (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936661 /usr/lib/libc-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936618 /usr/lib/libm-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30            24316 /usr/lib/libncursesw.so.5.9 (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936627 /usr/lib/libdl-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1249113 /usr/lib/libcap.so.2.24 (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1936645 /usr/lib/ld-2.19.so (path dev=0,33)
zsh     23748 mikeserv  mem    REG   0,30          1720288 /usr/lib/locale/locale-archive (path dev=0,33)
zsh     23748 mikeserv    0u   CHR  136,6      0t0       9 /dev/pts/6
zsh     23748 mikeserv    1u   CHR  136,6      0t0       9 /dev/pts/6
zsh     23748 mikeserv    2u   CHR  136,6      0t0       9 /dev/pts/6
zsh     23748 mikeserv   10u   CHR  136,6      0t0       9 /dev/pts/6

음, 어쨌든 파일 이름이군요. 나는 이 기능 중 많은 부분이 가능한 PID stat,ps/또는 흥미로운 PID를 사용하여 쉽게 재현될 수 있다고 생각합니다. 분명히 디렉토리가 있으며 fd다른 답변에서 언급했듯이 /proc/self파일 시스템에서 루트, cwd를 얻을 수도 있습니다.

관련 정보