bashrc에 다음 함수를 작성했습니다. 5초마다 작업이 실행 중인지 확인하고 작업이 완료되면 이메일을 보냅니다.
function jobcheck () {
time=`date`
jobstatus=`jobs $1`
while [ 1 ]; do
if (( ! `echo $jobstatus | grep "Running" | wc -l` )); then
"sendEmail command to send email"
break;
fi
sleep 5;
done
}
이 함수를 다음과 같이 호출하고 싶습니다(예를 들어 작업 번호 2의 경우).
jobcheck 2
명령줄에서 다른 명령을 계속 실행합니다. 하지만 while 루프가 계속 실행되고 명령 프롬프트가 표시되지 않습니다.
내가 실행하면
jobcheck 2 &
그런 다음 오류가 발생합니다.bash: jobs 2 not found
이 기능을 백그라운드에서 어떻게 실행할 수 있나요?
답변1
이렇게 하려면 함수를 다시 작성해야 합니다.
를 사용하여 백그라운드 작업을 시작하면 &
셸이 작업을 추적하고 jobs
내장 기능을 사용하여 실제로 더 많은 정보를 찾을 수 있습니다. 그러나 이 정보는 특정그 인스턴스shell; 함수를 직접 실행하면 &
백그라운드 작업이 포함된 셸이 아닌 별도의 셸이 생성되므로 해당 별도의 셸에서 원래 셸 작업에 대한 정보에 액세스할 수 없습니다.
그러나 이 문제를 해결하는 간단한 방법이 있습니다.
- 작업 번호 대신 프로세스 ID(PID)를 기반으로 실행되도록 함수를 다시 작성하세요. 즉, 프로세스가 여전히 존재하는지 확인하도록 합니다(예:
ps
출력을 구문 분석하거나 프로세스가/proc/pid
존재하는지 확인). %2
대신 인수로2
새 함수를 실행하십시오 . 즉, 모니터링하려는 작업 ID 뒤에 백분율 기호를 지정합니다. Bourne 쉘은 백분율 기호를 사용하여 작업 ID를 해당 작업의 pid로 바꿉니다.
이것으로 작동합니다.