내가 실행한다고 가정하면 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
답변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