쉘 스크립트에서 마지막으로 실행 된 명령의 pid를 얻는 방법?


254

다음과 같은 쉘 스크립트를 갖고 싶습니다.

my-app &
echo $my-app-pid

그러나 방금 실행 된 명령의 pid를 얻는 방법을 모르겠습니다.

jobs -p my-app명령을 사용 하여 pid를 grep 할 수 있다는 것을 알고 있습니다 . 그러나 셸을 여러 번 실행하려면이 방법이 작동하지 않습니다. 때문에 jobspec이 모호합니다.

답변:


338

마지막으로 실행 된 명령의 PID는 $!쉘 변수에 있습니다.

my-app &
echo $!

1
예를 들어 pid를 인쇄하고 있습니다. [1] 893. 나는 숫자 만 원한다.
user3153014

33
이것은 백그라운드에서 시작된 프로그램을 나타냅니다 . 백그라운드 프로세스가 시작되지 않은 경우 매개 변수가 설정되지 않습니다.
ramrunner

5
또 다른 가치 솔루션 (에 대한 답변에 대한 코멘트)에서 제안 하는 방법 막 시작 프로세스의 PID를 얻는 오을하고 "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- 11월 24일 '10 sysfault 14시 28분에
IMZ - 이반 Zakharyaschev

14
@ user3153014 "[2] 2625"와 같은 문자열은 백그라운드 작업을 시작한 후 쉘로 인쇄됩니다. 이것은 출력과 관련이 없습니다echo $!
페트르 Gladkikh

프로세스가 끝날 때까지 기다려야 할 때 일반적으로 스크립트에서 이러한 코드를 사용합니다. my-app & myVar=$! ; fg. fg프로세스를 다시 포 그라운드로 만듭니다. echo $myVar나중에 인쇄 할 수 있으며 my-app가 이미 완료된 것입니다.
Vrata Blazek

66

입수 PID:

#!/bin/bash
my-app &
echo $!

PID변수로 저장 :

#!/bin/bash
my-app &
export APP_PID=$!

모든 인스턴스 PID를 텍스트 파일로 저장하십시오 .

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

출력, 오류 및 PID분리 된 파일을 저장하십시오 .

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"

3
질문은 리디렉션에 대해 묻지 않았지만 대답은 my-app완료 된 인스턴스 와 나중에 PID가 더 재사용되는 경우 파일에 잘못된 정보가 있다는 점을 제외하고는 허용되는 것과 거의 동일 합니다. 이 답변이 기존의 승인 된 답변에 많은 가치를 더한다고 생각하지 않습니다
Eric Renouf

@EricRenouf 게시물이 업데이트되었습니다!
Eduardo Cuomo

유용 할 수있는 다른 파생물. 이 PID를 얻고, 동시에 (대부분) 전경 프로세스로 취급합니다 : sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
mlathe

isnt APP = main &PID를 잡는 방법?
MrMesees

3

같은 것을 시도하십시오

pidof my_app >> /tmp/my_app.pid

1
시스템이 PID를 직접 제공 할 수 있다면 외부 명령을 느리게하고 왜 모든 프로세스를 통해 검색하여 PID를 찾을 수 있습니까? 또한 정확한 가치를 얻을 수
있을지

-4

다음과 같이 해보십시오 :

 ps ef | grep "[m]y-app" | awk '{print $2}'

프로세스의 첫 글자를 사이에두면 프로세스가 목록에 [ ]나타나지 않습니다 grep. 필요한 경우 사용자 이름에 grep을 추가 할 수도 있습니다.


9
즉 최고의 매우 깨지기 그리고 경우 작동하지 않습니다 my-app번 이상 실행 - davidshen84 특히 그 CAS에 대한 걱정.
Mat

2
이 경로를 이용하더라도 pgrep대신 사용해야 합니다.
Willem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.