Korn 쉘 스크립트에서 특정 기능을 호출하는 프로세스의 ID를 기록하고 싶습니다.
예를 들어, 사용자 정의 자동 로드 함수 SQUARE를 고려해 보겠습니다. 이제 TestSquare.sh 스크립트가 SQUARE 함수를 호출하는 경우. 실행 중인 TestSquare.sh의 프로세스 ID와 TestSquare.sh 프로세스의 시작 시간을 캡처하고 싶습니다.
함수에 매개변수를 전달하고 싶지 않습니다. 호출 스크립트의 프로세스 ID만 사용하여 모든 정보를 구성하고 싶습니다.
답변1
쉘의 프로세스 ID는 특수 매개변수에서 사용할 수 있습니다 $$
(ksh 매뉴얼의 "매개변수 확장" 섹션에 설명되어 있음).
log () {
printf "script=%s pid=%d message=%s\n" "$0" "$$" "$1"
}
이는 $$
스크립트의 프로세스 ID입니다. 하위 쉘(즉, 괄호 안, 명령 대체 내, 파이프 왼쪽 등)에서 코드를 실행하는 경우 값은 변경되지 않습니다 $$
. 실제로 로그 메시지를 발행한 프로세스 ID를 원하는 경우 하위 프로세스를 호출하고 상위 프로세스 ID를 보고하도록 지정하여 얻을 수 있습니다. (일부 쉘에는 변수가 있지만 ATT ksh는 아닌 것 같습니다.)
log () {
printf "script=%s script_pid=%d emitting_pid=%d message=%s\n" \
"$0" "$$" "$(sh -c 'echo $PPID')" "$1"
}
스크립트의 시작 시간을 기록하려는 경우 가장 쉬운 방법은 스크립트가 시작될 때 현재 시간을 변수에 할당하는 것입니다.
#!/bin/ksh
start_time=$(date)
나중에 스크립트의 시작 시간을 가져와야 하는 경우 get 을 사용할 수 있지만 ps -o stime
전체 날짜와 시간은 제공되지 않습니다. 또는 SECONDS
변수(항상 스크립트가 시작된 이후의 초 수를 포함함)와 현재 날짜를 기반으로 계산할 수 있습니다. ksh를 사용하는 경우 GNU 날짜가 없을 수 있으므로 편리한 날짜 계산 도구가 없습니다. awk는 다음으로부터 얻을 수 있는 우회 방법을 제공합니다.연대이므로 다음 코드 조각은 start_time
에포크 이후 스크립트의 시작 시간을 초 단위로 설정합니다.
start_time=$(export SECONDS; awk 'BEGIN {srand(); print srand() - ENVIRON["SECONDS"]; exit}')