세션의 프로세스 및 대화형 셸의 스크립트 프로세스

세션의 프로세스 및 대화형 셸의 스크립트 프로세스

스크립트에서 이 명령을 실행하면 다음의 헤더 외에는 출력이 생성되지 않습니다 ps.

 # Taken from Advanced Bash Usage on youtube:

 echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"

출력은 다음과 같습니다.

$./testing.bash
  PID TTY      STAT   TIME COMMAND

하지만 여기서는 터미널에서 실행되어 생성됩니다.예상 출력:

$echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"
  PID TTY      STAT   TIME COMMAND
18289 pts/4    Ss+    0:00 /bin/bash
17917 pts/4    S+     0:00  \_ /bin/bash
17918 pts/4    S+     0:00      \_ /bin/bash
17919 pts/4    S+     0:00          \_ /bin/bash
17920 pts/4    S+     0:00              \_ /bin/bash
17921 pts/4    R+     0:00                  \_ ps wwf -s 18289

질문:

차이점을 설명하고 올바른 방법을 알려주실 수 있나요?

나는 많은 것을 시도했고 4시간 동안 검색했습니다. 원한다면 내가 시도한 것을 나열할 수 있지만 여기서는 관련이 없다고 생각합니다.

$echo $SHELL
/bin/bash

그리고:

$head -1 testing.bash 
#!/bin/bash

답변1

ps' -s sessionid옵션은 세션 ID를 기준으로 프로세스를 선택하는 것입니다.

ps -j를 사용하여 프로세스의 세션 ID를 볼 수 있습니다 . 세션 및 프로세스 그룹은 일반적으로 셸 작업 제어에 사용됩니다(따라서 이름이 -j).

터미널 에뮬레이터는 이 프로세스를 사용하여 새 세션을 만든 다음 해당 세션을 재사용하여 선호하는 셸을 실행합니다. 따라서 터미널에서 세션 ID는 일반적으로 쉘의 pid와 동일합니다.

그래서 만약 당신 ps -j -s "$$"저것쉘을 사용하면 세션에서 프로세스를 얻을 수 있습니다."$$" 발생하다세션 ID와 동일합니다.

다른 쉘(예: 스크립트를 해석하기 위해 하위 프로세스에서 실행되는 쉘 testing), 세션 리더가 아닌 쉘에서 명령을 실행하면 해당 쉘 pid에 해당하는 세션 ID가 없기 때문에 결과를 얻을 수 없습니다. .

$ ps -j -s "$$"
  PID  PGID   SID TTY          TIME CMD
 7239  7239  7239 pts/7    00:00:00 zsh
21002 21002  7239 pts/7    00:00:00 ps

$$회의 담당자 7239입니다. 그러면 ps -j -s 7239해당 세션의 모든 프로세스가 제공됩니다.

$ sh -xc 'ps -j -s "$$"; ps -j -p "$$"'
+ ps -j -s 21044
  PID  PGID   SID TTY          TIME CMD
+ ps -j -p 21044
  PID  PGID   SID TTY          TIME CMD
21044 21044  7239 pts/7    00:00:00 sh

ps두 번째 명령에서 ps볼 수 있듯이 ID 21044의 프로세스가 세션 리더가 아니기 때문에 ID 21044의 세션이 없기 때문에 첫 번째 명령은 아무것도 반환하지 않습니다. 세션 리더는 여전히 7239이며, 터미널 에뮬레이터에 의해 시작된 쉘입니다.

$ sh -xc 'ps -j -s "$(($(ps -o sid= -p "$$")))"'
+ ps -o sid= -p 21215
+ ps -j -s 7239
  PID  PGID   SID TTY          TIME CMD
 7239  7239  7239 pts/7    00:00:00 zsh
21215 21215  7239 pts/7    00:00:00 sh
21217 21215  7239 pts/7    00:00:00 ps

이제 세션의 모든 프로세스를 볼 수 있습니다. 우리는 이를 사용하여 ps -o sid= -p "$$"그것이 속한 세션의 ID를 얻습니다.$$

관련 정보