백그라운드 프로세스 시작 및 종료 시점 확인

백그라운드 프로세스를 시작하고 bash 스크립트 내에서 종료되는 시점을 확인하려면 어떻게해야합니까? 내 아이디어는 다음과 같은 스크립트입니다.

launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED" 

Answer

핵심은 “wait”명령 :

#!/bin/bash /my/process & /another/process & wait echo "All processes done!" 

댓글

  • 이점 : CPU를 소모하지 않습니다. 무한 루프가 항상 실행되는 시간입니다 ….;)
  • 이 방법의 단점은 기다리는 동안 ' 다른 작업을 수행 할 수 없다는 것입니다. , 사용자에게 진행 상황을 표시하는 등. cuonglm '의 솔루션 만 가능합니다.
  • @Mark Booth 세 번째 비동기 작업의 진행 상황을 나타냅니다. 예 : cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;

답변

wait 필요한 세분성을 가질 수 있습니다.

sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo "PID1 has ended." wait echo "All background processes have exited." 

답변

다음은 한 가지 방법입니다.

launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" exit 0 

댓글

  • 감사합니다. 이것이 원래 질문에 대한 나의 해석에 대한 답을 제공하는 유일한 답변입니다 (그리고이 질문을 보게 된 이유)
  • @cuonglm, 여러 프로세스가있는 것은 무엇입니까? 아마도 wait가 더 적합할까요?
  • @cuonglm 명령을 죽이는 -0 옵션은 무엇을합니까?
  • @k_vishwanath 프로세스 여부를보고합니다. 아직 실행 중이거나 실행 중이 아닙니다.

Answer

nohup으로 프로세스를 실행하고 읽을 쉘 스크립트를 작성할 수 있습니다. nohup이 로그에 사용하는 nohup.out 파일입니다.

 nohup command & 

댓글

  • (1) 머리카락이 쪼개 질 위험이 있으므로 nohup는 ' nohup.out에 아무것도 쓰지 않습니다. 파일을 만들고 명령의 출력을 파일로 리디렉션합니다. (2) 명령이 ' 출력을 생성하지 않으면 nohup.out에 아무것도 기록되지 않으며이 아이디어는 빠르게 진행되지 않습니다. (3) command 가 출력을 작성하더라도 출력을 모니터링하여 언제 끝날지 어떻게 알 수 있습니까?
  • @ G- Man 아마도 lsof의 출력을 확인하여 nohup가 여전히 nohup.out를 사용하고 있는지 확인할 수 있습니다. 하지만 이것이 매우 어려운 방법이라는 데 동의합니다.
  • (4) command 가 실행되기 시작하면 nohup가 사라졌습니다. (1) 예, 2 년 전에 말한 내용을 반복하기 때문에 번호를 반복합니다. nohupnohup.out. (5) 예, 셸 스크립트를 작성하여 lsof를 반복하고 실행하여 nohup.out가 아직 열려 있는지 확인할 수 있습니다. 그러나 그것은 다른 대답이 될 것입니다. (6) 그렇게하더라도 신뢰할 수 없습니다. 다른 프로세스에서 nohup.out 파일을 열면 어떻게 되나요? 이 특정 프로세스에 nohup.out가 열려 있는지 확인하고 싶을 것입니다. (7)하지만 그렇게하려는 경우 프로세스가 실행 중인지 확인하는 것이 어떻습니까?

답변

wait는 동일한 셸에서 시작된 하위 프로세스에서만 작동합니다. 그것은 “결국 쉘 기능입니다.

모든 임의의 백그라운드 프로세스에 대해 PID로 작업해야합니다. 여기에서 아무도 언급하지 않는 것은 커널 PID 재활용 입니다. 현대의 리눅스 시스템은 PID를 상당히 재사용 할 수 있습니다. 종종로드에 따라 다릅니다. 공정을 안정적으로 식별하려면 PID 이상의 것이 필요합니다. 한 가지 간단한 방법은 시간을 절약하는 것입니다. 프로세스가 시작될 때 현재 프로세스 시작 시간과 정기적으로 비교합니다. PID를 재활용해야하는 경우 시작 시간은 동일하지 않습니다.

프로세스 시작 시간은 / proc / [pid] / stat 파일. 시간은 지피 (최대 10ms)로 측정되며 프로세스 ID 재활용을 감지하는 정밀도.

PID=<process ID> START_TIME=$(cut -d " " -f 22 /proc/$PID/stat) while [ "$(cut -d " " -f 22 /proc/$PID/stat 2>/dev/null)" = "$START_TIME" ]; do echo "PROCESS IS RUNNING" sleep 1 done 

답글 남기기

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