스크립트에서 이 명령을 실행하면 다음의 헤더 외에는 출력이 생성되지 않습니다 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를 얻습니다.$$