내 응용 프로그램 스크립트를 호출하는 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
하위 프로세스입니다 . 손자 프로세스는 상위 프로세스를 소유 하고 상위 프로세스는 해당 프로세스를 소유합니다.httpd
PPID
30469
httpd
PPID
PPID
httpd
둘 다 상당히 크기 때문에 전체 출력을 게시하지 않습니다. 다음은 각 출력의 예입니다.
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보다 크다는 것을 알았습니다. 이는 다음 두 가지 이유로 신뢰할 수 있는 것이 아닙니다.
- 허용되는 최대 PID가 프로세스에 할당되면 PID 할당 랩어라운드가 발생하고 이전 PID가 재사용되기 시작합니다. 랩어라운드가 발생하면 다음 PID는 이전 PID보다 작아집니다. 그 이후의 새 PID는 아직 실행 중인 프로세스에서 PID로 사용되는 숫자를 건너뜁니다.
OpenBSD와 같은 일부 시스템은 무작위 PID 할당을 사용합니다.
$ for i in {1..5}; do bash -c 'echo $$'; done 49915 2152 61168 87739 95187
참고로 대신 를 사용하여 현재 작업 디렉터리를 가져올 수 $PWD
있습니다 $(pwd)
.