Korn Shell에서 서브쉘의 PID를 얻는 방법($BASHPID와 동일)

Korn Shell에서 서브쉘의 PID를 얻는 방법($BASHPID와 동일)

Bash에는 $BASHPID라는 편의 변수가 있는데, 이 변수는 항상 현재 실행 중인 하위 쉘의 PID를 반환합니다. ksh에서 서브쉘의 PID를 얻는 방법은 무엇입니까? 예를 들어 다음 코드를 살펴보세요.

#!/usr/bin/ksh93

echo "PID at start: $$"

function run_in_background {
  echo "PID in run_in_background $$"
  run_something &
  echo "PID of backgrounded run_something: $!"
}

function run_something {
  echo "*** PID in run_something: $$"
  sleep 10;
}    

run_in_background
echo "PID of run in background $!"

출력은 다음과 같습니다.

PID at start: 5328
PID in run_in_background 5328
*** PID in run_something: 5328
PID of backgrounded run_something: 5329
PID of run in background 5329

내가 원하는 것은 ****예제 5329에서 서브쉘의 PID로 시작하는 줄을 출력하는 것입니다.

답변1

ksh에서는 이것이 가능하지 않다고 생각합니다. 외부 프로세스 실행과 관련된 POSIX 솔루션이 있습니다.

sh -c 'echo $PPID'

Linux에서도 readlink /proc/self작동하지만 아무런 이점이 없습니다(약간 더 빠를 수 있습니다. readlinkBusyBox 변형이 있지만 그렇지 않은 경우 유용 할 수 있지만 $PPID그렇게 생각하지 않습니다).

셸에서 값을 얻으려면 수명이 짧은 하위 셸에서 명령을 실행하지 않도록 주의해야 합니다. 예를 들어, 명령 대체에서 호출된 하위 쉘의 출력이 표시될 수 있습니다 p=$(sh -c 'echo $PPID')(또는 일부 쉘은 이 상황을 최적화하지 않을 수도 있습니다). sh대신 실행

p=$(exec sh -c 'echo $PPID')

답변2

원하는 것을 얻을 수 있지만 run_something을 별도의 스크립트에 넣어야 합니다. 이유는 잘 모르겠지만 $$를 호출하는 동일한 스크립트의 함수 내에서 사용될 때 $$가 다시 계산되지 않습니다. $$ 값은 스크립트가 구문 분석된 후 실행되기 전에 한 번 할당되는 것 같습니다.

run_in_Background.sh

#
echo "PID at start: $$"

    function run_in_background {
      echo "PID in run_in_background $$"
      ./run_something.sh &
      echo "PID of backgrounded run_something: $!"
    }

    run_in_background
    echo "PID of run in background $!"

run_something.sh

#
echo "*** PID in run_something: $$"
sleep 10;

산출

PID at start: 24395
PID in run_in_background 24395
PID of backgrounded run_something: 24396
PID of run in background 24396
*** PID in run_something: 24396

답변3

# KSH_VERSION hasn't always been a nameref, nor has it always existed.
# Replace with a better test if needed. e.g.:
# https://www.mirbsd.org/cvs.cgi/contrib/code/Snippets/getshver?rev=HEAD
if [[ ${!KSH_VERSION} == .sh.version ]]; then
    # if AT&T ksh
    if builtin pids 2>/dev/null; then # >= ksh93 v- alpha
        function BASHPID.get { .sh.value=$(pids -f '%(pid)d'); }
    elif [[ -r /proc/self/stat ]]; then # Linux / some BSDs / maybe others
        function BASHPID.get { read -r .sh.value _ </proc/self/stat; }
    else # Crappy fallback
        function BASHPID.get { .sh.value=$(exec sh -c 'echo $PPID'); }
    fi
elif [[ ! ${BASHPID+_} ]]; then
   echo 'BASHPID requires Bash, ksh93, or mksh >= R41' >&2
   exit 1
fi

답변4

#!/bin/ksh
 function os_python_pid {
/usr/bin/python  -c 'import os,sys ; sys.stdout.write(str(os.getppid()))'
}
function os_perl_pid {
/usr/bin/perl -e 'print getppid'
}

echo "I am $$"
    echo "I am $(os_python_pid) :: $(os_perl_pid)"
function proce {
  sleep 3
  echo "$1 :: $(os_python_pid) :: $(os_perl_pid)"
}

for x in aa bb cc; do
  proce $x &
  echo "Started: $!"
done

관련 정보