시간별로 프로세스 시작의 PID를 가져옵니다.

시간별로 프로세스 시작의 PID를 가져옵니다.

내가 실행한다고 가정하면 time ./a.out변수를 통해 PID를 얻을 수 있습니다. 그런데 PID는 어떻게 얻나요?time$!a.out

물론 출력을 구문 분석할 수 있지만 ps좀 더 우아한 솔루션을 원합니다.

확인했지만 man time아무것도 찾을 수 없었습니다.

내가 얻은 가장 가까운 것은 이었지만 time (sleep 10 & echo $!)분기로 인해 소요된 시간은 기본적으로 10초가 아니라 0이었습니다.

답변1

정의에 따르면 a.out이는 하위 프로세스입니다 time. time부모 프로세스의 pid도 마찬가지입니다 a.out! 다음은 내가 a.out대체 할 테스트입니다 sleep 60.

$ time sleep 50 & timepid=$!
$ aoutpid=$(pgrep -P $timepid)
$ ps -o ppid,pid,start,cmd w -p $$,$timepid,$aoutpid

PPID   PID  STARTED CMD
2065  2068 21:34:57 -bash
2068  3297 22:16:05 -bash
3297  3298 22:16:05 sleep 50

(참고: 은 time실제로 쉘 내장 명령이므로 위의 명령은 bash!)

답변2

명령을 실행하는 데 필요한 시간에 비해 셸을 시작하는 시간이 무시할 수 있는 경우 중간 셸을 실행하고 내장 명령을 사용하여 셸이 하위 프로세스로 실행되지 않고 대체되는지 exec확인할 수 있습니다 .a.out

time sh -c 'echo $$; exec ./a.out'

답변3

pgrepPID를 찾아보세요 :

pgrep -l "a.out"

읽다map pgrep더 많은 아이디어를 얻기 위해.

답변4

작은 셸 조각을 작성하여 나머지 명령줄을 하위 프로세스로 실행하고 하위 프로세스의 PID를 부작용으로 캡처할 수 있습니다.

다음은 이 작업을 수행하는 스크립트입니다(간결함을 위해 오류 검사는 생략됨).

#!/bin/sh
#
"$@" &
CHILD=$!
echo "$CHILD" >/tmp/mychild.pid
echo "INFO: child is $CHILD" >&2
wait

이름을 지정하려면 whatsmychild장면에서 다음과 같이 사용합니다.

time whatsmychild a.out

그것이 효과가 있다는 증거가 있습니까? 여기에 또 다른 스크립트가 있습니다 whatsmypid.

#!/bin/sh
#
echo "My PID is $$" >&2
exit 0

이제 실행하겠습니다:

$ time identifymychild whatsmypid
INFO: child is 8105
My PID is 8105

real    0m0.006s
user    0m0.000s
sys     0m0.000s
$ cat /tmp/mychild.pid
8105

관련 정보