Bash에서 호스트 스크립트의 PID 가져오기

Bash에서 호스트 스크립트의 PID 가져오기

내 응용 프로그램 스크립트를 호출하는 script()가 있습니다 run.sh. run.sh주어진 시간에 이것을 여러 번 실행할 수 있습니다 .

run.sh 스크립트의 일반적인 형식은 다음과 같습니다.

#!/bin/bash
# Running DALTON JOB: Helix
dir=$(pwd)
    echo "-----------------------------------------------"
   export DALTON_TMPDIR=/mnt/raid0/scratch
    export OMP_NUM_THREADS=6
    source /opt/intel/compilers_and_libraries_2017.0.098/linux/bin/compilervars.sh intel64
    source /opt/intel/mkl/bin/mklvars.sh intel64
    echo "//-------process started----------------------------//"

./application.sh  -mb 14550 input.mol output.out

echo "//-------process finished----------------------------//"

application.sh스크립트 내에서 PID를 얻을 수 있습니까 run.sh? ( $$스크립트 자체의 PID를 제공하는 것으로 나타났습니다 .)

또한 응용 프로그램의 PID가 항상 상위 스크립트보다 수치적으로 더 크다는 것을 알았지만 이는 우연의 일치일 수도 있습니다.

답변1

실행 중인 PID를 보려면 application.sh명시적으로 이를 백그라운드에 두고 PID를 캡처한 다음 종료될 때까지 기다리는 것이 좋습니다.

# ...
./application.sh  -mb 14550 input.mol output.out &
app_pid=$!
echo "The application pid is: $app_pid"
wait "$app_pid"
# ...

답변2

pstree -p합계 와 ps axjf추가 구문 분석 과 같은 조합이 필요할 수도 있다고 생각합니다 .

PID는 httpd이고 각 프로세스의 ( 상위 프로세스 ID)는 30469하위 프로세스입니다 . 손자 프로세스는 상위 프로세스를 소유 하고 상위 프로세스는 해당 프로세스를 소유합니다.httpdPPID30469httpdPPIDPPIDhttpd

둘 다 상당히 크기 때문에 전체 출력을 게시하지 않습니다. 다음은 각 출력의 예입니다.

user@host$ ps -axjf
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
1     30469 30469 30469 ?           -1 Ss       0   0:46 /usr/sbin/httpd
30469 22410 22410 22410 ?           -1 Ssl      0   0:00  \_ PassengerWatchdog
22410 22413 22413 22410 ?           -1 Sl       0  23:06  |   \_ PassengerHelperAgent
22410 22418 22418 22410 ?           -1 Sl      99   0:01  |   \_ PassengerLoggingAgent
30469 22442 30469 30469 ?           -1 Sl      48   7:55  \_ (wsgi:pulp)
30469 22443 30469 30469 ?           -1 S       48   1:48  \_ /usr/sbin/httpd
30469 22445 30469 30469 ?           -1 S       48   1:55  \_ /usr/sbin/httpd
30469 22447 30469 30469 ?           -1 S       48   1:54  \_ /usr/sbin/httpd

user@host$ pstree -p
 ├─httpd(30469)─┬─PassengerWatchd(22410)─┬─PassengerHelper(22413)─┬─{PassengerHelpe}(22415)
        │              │                        │                        ├─{PassengerHelpe}(22416)
        │              │                        │                        ├─{PassengerHelpe}(22417)
        │              │                        │                        ├─{PassengerHelpe}(22420)
        │              │                        │                        ├─{PassengerHelpe}(22422)
        │              │                        │                        ├─{PassengerHelpe}(22423)
        │              │                        │                        ├─{PassengerHelpe}(29342)

상위 프로세스 트리를 알고 있으면 실행할 수 있습니다 pstree -p <pid>.

답변3

유틸리티의 프로세스 ID를 저장하려면 비동기 프로세스로 시작하고 해당 PID를 변수에 저장하거나 $!직접 사용하십시오(가장 최근에 시작된 백그라운드 프로세스의 PID임).

#!/bin/bash

export DALTON_TMPDIR=/mnt/raid0/scratch
export OMP_NUM_THREADS=6
source /opt/intel/compilers_and_libraries_2017.0.098/linux/bin/compilervars.sh intel64
source /opt/intel/mkl/bin/mklvars.sh intel64

printf 'Started at "%s"\n' "$(date)"

SECONDS=0
./application.sh -mb 14550 input.mol output.out &

app_pid="$!"

printf 'Application PID is %d\n' "$app_pid"

wait "$app_pid"

printf 'Ended at "%s"\n' "$(date)"
printf 'Run time was approximately %d minutes (%d seconds)\n' "$(( SECONDS/60 ))" "$SECONDS"

애플리케이션의 PID는 입니다 $app_pid.


새로운 프로세스의 PID가 항상 이전 프로세스의 PID보다 크다는 것을 알았습니다. 이는 다음 두 가지 이유로 신뢰할 수 있는 것이 아닙니다.

  1. 허용되는 최대 PID가 프로세스에 할당되면 PID 할당 랩어라운드가 발생하고 이전 PID가 재사용되기 시작합니다. 랩어라운드가 발생하면 다음 PID는 이전 PID보다 작아집니다. 그 이후의 새 PID는 아직 실행 중인 프로세스에서 PID로 사용되는 숫자를 건너뜁니다.
  2. OpenBSD와 같은 일부 시스템은 무작위 PID 할당을 사용합니다.

    $ for i in {1..5}; do bash -c 'echo $$'; done
    49915
    2152
    61168
    87739
    95187
    

참고로 대신 를 사용하여 현재 작업 디렉터리를 가져올 수 $PWD있습니다 $(pwd).

관련 정보