`/proc/$PID/cwd`: POSIX에 해당하는 것이 있나요?

`/proc/$PID/cwd`: POSIX에 해당하는 것이 있나요?

/proc내가 아는 한 Linux에는 POSIX의 일부가 아닌 디렉토리와 파일 시스템이 있습니다 . 각 하위 디렉터리에는 해당 PID 프로세스의 실제 작업 디렉터리를 가리키는 /proc/$PID기호 링크가 있습니다 (이 링크는 항상 최신 상태입니다).cwdcwd

이 기호 링크는 다른 셸을 사용하거나 두 셸(공식적으로 작업 디렉터리) 간에 파일을 교환하는 등 특정 사용 사례에 편리합니다.

POSIX 기능만을 사용하여 이와 같은 것을 쉽게 얻을 수 있는 방법이 있습니까?

문제에 대한 추가 정보

더 정확하게 설명하자면, 연결 및 환경 변수 lile 일 필요는 없습니다. $<PID>_CWD그것도 괜찮습니다. 언뜻 보기에는 그러한 솔루션이 존재한다고 믿지 않습니다. 쉽게 참조할 수 있어야 하며(예: 기호 링크 또는 환경 변수) 다른 프로세스가 작업 디렉터리를 전환할 때마다 항상 최신 상태로 유지되어야 합니다.

솔루션이 POSIX일 필요는 없습니다. 가장 중요한 측면은 이식성이지만 POSIX는 확실히 보장됩니다.

답변1

lsofBSD에는 기본적으로 설치되어 있지 않으므로 BSD에서 사용하려면 설치해야 합니다 .

쉘 스크립트를 작성하십시오.

#!/bin/sh
lsof -p $1 | grep cwd | awk '{print $9}'

경로의 디렉터리에 복사합니다. 첫 번째 매개변수 IE에 제공된 PID의 작업 디렉터리를 인쇄합니다.

$ script 1987
/home/enedil

답변2

POSIX는 관련되지 않은 프로세스에 대한 정보를 얻기 위한 많은 기능을 제공하지 않습니다. 오직ps, 실제로는 현재 디렉터리에 대한 정보를 제공하지 않습니다. C 수준 API도 더 나을 것은 없습니다(실제로 검색된 대부분의 정보는 ps출력을 구문 분석해야만 검색할 수 있습니다).

흥미롭게도 POSIX는 반대 작업을 수행하는 이식 가능한 방법을 제공합니다. 즉, 파일이 주어지면 다음을 호출하여 어떤 프로세스가 파일을 열고 있는지 확인할 수 있습니다.fuser. 다음 코드 조각은 특정 작업 디렉터리가 있는 프로세스의 PID를 나열합니다.

fuser -f "$directory_name" 2>&1 | sed -e '$!d' -e 's/.*://' -e 's/  */\
/' | sed -n 's/c$//p'

실제로 이식 가능한 방식으로 프로세스에 대한 정보를 얻으려면 다음을 사용하십시오.라소프. lsof의 작성자는 다양한 UNIX 변형에 대한 정보를 검색하는 다양한 방법을 구현하는 작업을 수행했습니다.

일상적인 검색의 경우:

lsof -a -p "$pid" -d cwd

자동 구문 분석의 경우:

lsof -a -p "$pid" -d cwd -F n | sed -e '1d' -e '2s/^n//'

개행 문자 는 lsof문자열로 대체됩니다 \n.

일부 Unix 변형은 타사 소프트웨어가 필요하지 않은 메서드를 제공하지만 이러한 메서드는 각 변형에 따라 달라집니다. 매우 관련성이 높은 참고 사항은 다음을 참조하십시오.파일 디스크립터 링크 이식성

일부 오래된 유닉스에는 pssetuid 루트가 있고 커널 메모리를 읽으므로 setuid 바이너리를 사용하는 것이 이 정보를 얻을 수 있는 유일한 방법입니다.

답변3

나는 내 자신의 답변에 기여할 것입니다.

/proc/$PID/cwd질문이 초점을 맞춘 대화형 셸의 맥락에서 한 가지 옵션은 Bash가 제공하는 자동화 기회를 사용하여 링크를 자동으로 유지하는 것일 수 있습니다.

PROMPT_COMMAND="ln -sfT \$(pwd) ~/$LINK_NAME"

f링크를 자주 덮어쓰게 되므로 이 옵션이 필요합니다. 이 T옵션은 필수입니다. 그렇지 않으면 f정상적으로 작동하는 것 같습니다.

예를 들어 다음을 사용하여 쉘이 협력하도록 할 수 있습니다 ~/.bashrc.

if [ -v CWD_LINK_NAME ]; then
   PROMPT_COMMAND='ln -sfT "$(pwd)" "'$CWD_LINK_NAME'";'$PROMPT_COMMAND
   declare -r CWD_LINK_NAME
   function rm_cwd_link() {
      rm "$CWD_LINK_NAME"
   }
   trap rm_cwd_link EXIT
fi

쉘이나 터미널을 CWD_LINK_NAME관련 값으로 설정하여 실행을 수행할 수 있습니다. 전임자.CWD_LINK_NAME="~/$SOME_ROLE_NAME" gnome-terminal

또 다른 옵션은 동일한 개념을 사용하여 가변 작업 디렉토리에서 배를 추적하는 것입니다. 이 추적은 두 가지 모두를 기반으로 합니다.@길스그리고@nedil기여하다:

PROMPT_COMMAND="PEAR_WD=\$(lsof -p $PID | awk '/cwd/{print \$9}')"

$PROMPT_COMMAND그러나 이는 덜 정확하고 덜 편리하지만 다른 쉘에 설정할 수 없는 드문 경우에는 이것이 유일한 방법일 수 있습니다.

나는 첫 번째 옵션을 선호합니다(다른 기여가 있는 경우 답변을 선택하기 전에 여전히 기다리고 있습니다).

관련 정보