cron 프로세스를 종료하고 다시 시작되지 않도록 방지

cron 프로세스를 종료하고 다시 시작되지 않도록 방지

크론 항목이 멈춰서 제거할 수 없습니다. cron 작업은 애플리케이션 시스템에 대해 야간 작업을 실행하는 스크립트를 시작합니다. 이 스크립트는 애플리케이션 시스템의 작업 스케줄러에 비동기 작업을 제출합니다. 다음 작업으로 넘어가기 전에 완료해야 할 몇 가지 단계가 있습니다. 이를 제어하기 위해 애플리케이션 서버의 반환 코드를 테스트합니다. 작업 상태가 59보다 크면 여전히 실행 중입니다. 따라서 다음 코드("getjobstatus" 명령은 사용하지 않지만 아래의 jobstatus에 숫자 값을 반환한다고 가정)는 다음과 같습니다.

jobstatus=0
while [[ $jobstatus -lt 60 ]]
do
   sleep 5
   jobstatus=`getstatus whatever`
done

"잠자기" 프로세스를 종료하려고 시도했지만 계속해서 다시 발생합니다. 어떻게 예방하고 영구적으로 제거할 수 있나요?

답변1

댓글에서 Deathgrip이 언급했듯이 상위 프로세스를 종료해야 하며 sleep몇 가지 변형을 찾을 수 있습니다 ps | grep sleep( ps구현이 많기 때문에 제공해야 할 플래그가 무엇인지 또는 출력이 어떻게 보이는지 정확히 추측할 수는 없습니다. 확인 man ps).

어떻게 되어가나요? 이를 죽이면 sleep종료되지만 포함된 스크립트의 실행에는 영향을 미치지 않습니다. 단지 다음 줄로 이동하고 루프가 계속 반복됩니다. 수면을 종료하기 위해 스크립트를 수정할 수 있는 방법에는 여러 가지가 있습니다. 가장 쉬운 방법 중 하나는 다음을 수행하는 것입니다 sleep 5 || exit.

또는 Bash(기타?)를 사용하는 경우 시작 부분에 다음 줄을 추가할 수 있습니다 set -e. 이는 명령이 실패하면(즉, 0이 아닌 상태를 반환하는 경우) Bash에게 스크립트를 종료하도록 지시합니다. 그러나 이는 스크립트의 모든 것에 영향을 미치고 다른 많은 함정이 있으므로 이 해결 방법은 피하는 것이 가장 좋습니다. ( set -e잠자기 전에 라인을 추가하고 set +e바로 비활성화할 수도 있지만, 제가 언급한 첫 번째 솔루션만 사용할 수 있기 때문에 이는 약간 우스꽝스럽습니다.)

답변2

프로세스가 있고 sleep절전 프로세스가 루프에서 실행되는 상위 쉘 스크립트의 일부인 경우(예:) 해당 (특정) 절전 명령이 실행되지 않도록 상위 프로세스를 종료해야 합니다. 다시 시작되었습니다.

잠자는 프로세스의 PID를 얻고 상위 프로세스를 찾은 다음 종료합니다.

$ ps -e -opid,comm,args|grep sleep
424241 sleep  sleep 999 # for example
$ ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE
424242 # for example
$ kill $(ps -oppid= -p SLEEP-PID-HERE-SUCH-AS-424241-ABOVE)

답변3

나는 당신이 다음과 같은 것을 원할 것이라고 생각합니다 : 터미널에서 bash 스크립트 반복을 중지하는 방법은 무엇입니까?

따라서 귀하의 경우 INT 대신 SIGTERM을 사용하면 cron 작업이므로 ctrl+C 대신 "kill"을 사용하여 종료하려고 한다고 가정합니다.

jobstatus=0
trap "exit" SIGTERM
while [[ $jobstatus -lt 60 ]]
do
    sleep 5
    jobstatus=`getstatus whatever`
done

sleep 명령뿐만 아니라 전체 스크립트를 종료할 수 있어야 합니다.

단순한 댓글이 아닌 별도의 답변으로 만들어서 죄송합니다. 아직 댓글을 달 수 있는 포인트가 부족합니다.

관련 정보