[완료-bash shell] shell variable : $! > pipe를 이용하였을 때, background pid를 알고 싶습니다.

APRIL1024의 이미지

안녕하세요. shell 을 배운지 얼마 안된 초짜 입니다.

현재 learning the bash shell 책을 보고 있습니다.

shell variable중 $! 는 "A related built-in shell variable is $!, which contains the process ID of the most recently invoked background job"이라고 설명 되어 있습니다.

shell에서 1개의 명령어를 background로 돌렸을 경우 echo $! 했을 때 올바르게 값이 나옵니다만,
2개의 명령어를 pipe로 연결 했을 때,
i.e) cat a.txt | less &
위와 같이 명령어를 실행하고 $!를 출력했을 때, less pid가 출력됩니다.

질문 1) 위와 같이 2개의 명령어를 pipe로 연결 했을 때, cat 의 pid는 알 수 없는지요?
질문 2) 위와 같이 한 명령어에서 pipe로 연결 하지 않고, 다른 방법을 이용해서라도 위 명령어가 실행이 되고, 2 명령어의 pid를 알 수 있는 방법은 없을까요?

cinsk의 이미지

pipe로 연결된 프로세스들은 process group ID(pgid)가 같으므로, ps 명령을 써서 해당 pgid를 가진 명령들을 얻으면 됩니다.

function pgrplst () {
  pgrp=`ps -p "$1" -o pgrp=`
  ppid=`ps -p "$1" -o ppid=`
  ps --ppid $ppid -o pgrp= -o cmd= | awk "\$1 == $pgrp { print \$2 }"
}

$ cat | less &
$ pgrplst $!
cat
less
$ _

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

APRIL1024의 이미지

제가 원하던 답변 진심으로 감사드립니다. (^_^)