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

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

my-app & echo $my-app-pid 

하지만 저는 방금 실행 한 명령의 pid를 얻는 방법을 모릅니다.

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

Answer

마지막으로 실행 된 명령의 PID는 $! 셸 변수 :

my-app & echo $! 

코멘트

  • 예를 들어 pid를 인쇄하고 있습니다. [1] 893. 숫자 만 원합니다.
  • 이것은 백그라운드에서 시작된 프로그램을 의미합니다. 백그라운드 프로세스가 시작되지 않은 경우 매개 변수가 설정되지 않습니다.
  • (답변에 대한 의견) pid를 얻는 방법에 또 다른 가치있는 해결책이 제안됩니다. 시작된 프로세스 : 아, 그리고 " oneliner " : /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 11 월 24 일 ' 10 일 14:28
  • @ user3153014 " [2] 2625와 같은 문자열 "는 백그라운드 작업을 시작한 후 셸로 인쇄됩니다. 이것은 echo $!
  • 의 출력과 관련이 없습니다.

  • 저는 일반적으로 프로세스가 끝날 때까지 기다려야 할 때 스크립트에서 이러한 코드를 사용합니다. my-app & myVar=$! ; fg. fg는 프로세스를 다시 포 그라운드로 가져옵니다. 그런 다음 나중에 echo $myVar를 인쇄 할 수 있으며 ' 내 앱이 이미 완료되었음을 확신합니다.

답변

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)" 

댓글

  • 질문이 ' 리디렉션에 대해 묻지 않으면 my-app의 인스턴스가 완료되고 나중에 PID가 재사용되는 경우를 제외하고는 수락 된 답변과 거의 동일합니다. ' 파일에 잘못된 정보가 있습니다. 저는 '이 답변이 기존의 허용 된 답변에 많은 가치를 추가한다고 생각하지 않습니다.
  • @EricRenouf 게시물이 업데이트되었습니다!
  • 다른 파생물 유용 할 수 있습니다. 이것은 PID를 가져와 동시에 (대부분) 포 그라운드 프로세스로 취급합니다. sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
  • isnt APP = main & PID를 파악하는 방법이 있습니까?

답변

다음과 같은 것을 시도해보십시오

pidof my_app >> /tmp/my_app.pid 

주석

  • 외부 명령, 시스템이 PID를 직접 제공 할 수있는 경우 모든 프로세스를 검색하여 해당 정보를 찾는 이유 ? 또한 ' ' 올바른 값을 얻을 수 있는지 확신 할 수 없습니다

답변

다음과 같이 시도해보세요.

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

프로세스의 첫 글자를 [ ]는 목록에 grep 프로세스가 없는지 확인합니다. 필요한 경우 사용자 이름에 grep을 추가 할 수도 있습니다.

댓글

  • 그 '는 매우 기껏해야 깨지기 쉽고 ' my-app가 두 번 이상 실행되면 작동하지 않습니다. davidshen84 는 특히 이에 대해 걱정합니다. cas.
  • 이 길을가더라도 대신 pgrep를 사용해야합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다