추가 읽기

추가 읽기

jobs각 작업이 호출될 때의 출력에 작업 디렉터리(반드시 각 작업의 현재 작업 디렉터리일 필요는 없음)가 포함되어 있다는 것이 맞습니까?

$ jobs -l | grep JDBC
[15]  20422 Running   PDFXCview all.pdf &  (wd: ~/mydata/dirlinks/cs/SQL/API/JDBC/general/official/tutorials)
[20]  20542 Running   PDFXCview all.pdf &  (wd: ~/mydata/dirlinks/cs/SQL/API/JDBC/general/wikipedia)

마찬가지로, ps각 프로세스가 호출될 때 각 프로세스의 이전 작업 디렉터리를 가져오는 것이 가능합니까?

호출 pgrep시 각 프로세스의 이전 작업 디렉터리의 경로명(문자열)을 검색할 수 있나요 pgrep ... <pattern_in_working_dir_pathname>?

프로세스 호출 시 작업 디렉터리에 있는 키워드로 프로세스를 검색하고 싶습니다.

감사해요.

답변1

jobs명령가능한프로그램의 작업 디렉토리 표시여기 간다, 해당 디렉토리가 쉘의 현재 디렉토리와 다른 경우. 이는 쉘이 현재 상태가 아닌 알고 있는 것(프로세스가 시작된 위치)을 추적하기 때문입니다.

또한 쉘에 의존합니다.

예를 들어bash

bash-4.4$ cd /tmp
bash-4.4$ sleep 1000 &
[1] 24807
bash-4.4$ jobs -l
[1]+ 24807 Running                 sleep 1000 &
bash-4.4$ cd /
bash-4.4$ jobs -l
[1]+ 24807 Running                 sleep 1000 &  (wd: /tmp)

하지만 ksh93이러지 마세요

$ sleep 1000 &
[1]     7164
$ jobs -l
[1] + 7164       Running                 sleep 1000 &
$ cd /
$ jobs -l
[1] + 7164       Running                 sleep 1000 &
$ 

나는 프로세스의 cwd를 찾는 이식 가능한 방법이 없다고 생각합니다. fstat, pwdx비슷한 것이 도움이 될 수 있습니다. root자신에게 속하지 않은 프로세스를 보려면 권한이 필요할 수 있습니다 .

Linux에서는 기호 링크를 확인하여 특정 경로와 일치하는 프로세스를 사용할 수 있습니다 /proc/.../cwd.

/tmp예를 들어, 경로에서 프로세스를 찾으려면 다음 을 수행하십시오.

% sudo ls -l /proc/*/cwd | grep /tmp
lrwxrwxrwx. 1 sweh     sweh     0 Jul 28 09:38 /proc/23435/cwd -> /news/tmp
lrwxrwxrwx. 1 sweh     sweh     0 Jul 28 09:39 /proc/7124/cwd -> /news/tmp

이는 심볼릭 링크로 인해 프로세스의 디렉터리 내부 표현과 일치하지 않을 수 있다는 점에 유의하세요.

$ cd /usr/tmp
$ pwd
/usr/tmp
$ ls -l /proc/self/cwd
lrwxrwxrwx. 1 sweh sweh 0 Jul 28 09:41 /proc/self/cwd -> /var/tmp/
$ ls -l /usr/tmp
lrwxrwxrwx 1 root root 10 May 13 09:39 /usr/tmp -> ../var/tmp/
$ 

껍질은 내가 안에 있다고 생각 /usr/tmp하지만 실제로는 안에 있습니다 /var/tmp.

다음을 추가하도록 편집되었습니다.

"어떤 프로세스가 마운트 지점을 사용하고 있는지"에 대한 질문이 있을 수 있는 이 문제의 특별한 경우가 있습니다. cwd열려 있을 수 있는 파일은 보고되지 않습니다 .

예를 들면 다음과 같습니다.

$ sudo fuser -u -c /brick
/brick:               3552(root)
$ ps -p 3552
  PID TTY          TIME CMD
 3552 ?        00:04:51 glusterfsd
$

우리는 프로세스가 파일 시스템을 glusterfsd사용하는 유일한 프로세스라는 것을 알고 있습니다./brick

답변2

이를 수행하는 이식 가능한 방법은 없지만 psfor 루프를 사용하여 ps모든 프로세스를 인쇄한 다음 이를 다른 명령으로 파이프하여 현재 작업 디렉터리를 인쇄할 수 있습니다.

pwdx프로세스의 현재 작업 디렉터리를 구체적으로 인쇄하는 것부터 시작해 보겠습니다 .

루트로 실행:

for i in $(ps aux | awk '{print $2}'); do pwdx $i; done

ps aux | awk '{print $2}'각 프로세스의 pid를 인쇄합니다.

pwdx $ipid의 i 변수를 전달합니다.pwdx

pwdxpid를 단독으로 사용할 수 있지만 for 루프는 이들을 함께 실행합니다.

를 사용할 수도 있지만 시스템에 따라 lsof패키지를 먼저 설치해야 할 수도 있습니다. lsof루트로 실행:

for i in $(ps aux | awk '{print $2}'); do lsof -p $i | grep cwd; done

ps aux | awk '{print $2}'각 프로세스의 PID를 인쇄합니다.

lsof -p $ii 변수를 다음으로 전달합니다.lsof

grep cwdcwd현재 작업 디렉토리가 포함된 줄을 인쇄합니다.

명령 과 관련하여 pgrep다음 형식을 사용할 수 있습니다.

pgrep <process-name>

프로세스의 PID도 찾으려면 여전히 이를 전달하거나 lsof현재 pwdx작업 디렉토리를 찾아야 합니다.

첫 번째는 for loopFedora 28, Centos 7.5, RHEL 7.5 및 Debian 9에서 작동하지만 FreeBSD 11에서는 작동하지 않습니다.

두 번째 버전은 for loopFedora 28, Centos 7.5, RHEL 7.5 및 Debian 9에서 사용할 수 있습니다. FreeBSD 11.1에서도 작동합니다. 제 경우에는 lsofFreeBSD 11 버전에 대한 경고 메시지가 출력되고 저는 FreeBSD 11.1입니다.

답변3

프로세스의 작업 디렉터리는 많은 운영 체제의 다른 프로세스에 알려져 있습니다. BSD와 Linux에서는 각각 sysctl()커널에서 사용하고 쿼리할 수 있습니다 procfs. 그러나 Linux ps의 procps 명령 ps이나 BSD의 명령은 이 정보를 얻거나 보고하지 않습니다.

BSD에서 프로세스의 현재 디렉토리를 얻으려면 명령은 fstat파일 시스템과 inode 번호를 보고하는 입니다.

% fstat -p $$|awk '{ if ("wd" == $4 || 1 == NR) 인쇄 }'
사용자 명령 PID FD 설치 INUM 모드 SZ|DV R/W
JdeBP zsh 71512 wd /usr/home/JdeBP 4 drwxr-xr-x 127 r
%

물론 작업 디렉터리는 여러 이름으로 액세스할 수 있으며 콘텐츠 이름이 변경되고 링크가 생성/파기됨에 따라 이러한 이름이 변경될 수 있습니다. 그것의 안정적인 부분은 파일 객체, 즉 vnode이며, 이에 도달하는 데 사용되는 디렉토리 항목이 아닙니다.

따라서 이름을 보고하는 Linux 메커니즘이 반드시 신뢰할 수 있는 것은 아닙니다./proc/pid/cwd

마지막으로 : 참고하세요현재의프로세스의 디렉터리는 프로세스가 생성되었을 때의 작업 디렉터리일 필요는 없습니다. 이는 모든 작업 제어 셸의 디렉터리입니다.실제로알다.

추가 읽기

관련 정보