Side-Project

[NAS] 시놀로지 도커, 스케줄러 "예약 작업이 이미 실행 중.." 오류

냐옹멍멍 2024. 11. 21. 11:24
반응형

오류 내용

SYSTEM: Scheduled Task [Task 9] skipped because the task was already running. Please check the task content/settings.

node를 설치한 컨테이너이고 하루 한번 실행하도록 스케줄을 설정했는데,

테스트를 위해 직접 실행을 해보니 이미 실행 중이라 실행을 안 한단다..
내용 자체는 오류가 아니지만 내가 원하는 동작을 안 하면 그게 오류지 뭐..
ssh로 도커에 직접 접근해 현재 프로세스를 확인해 봤다.

ps aux

/bin/sh로 접근해 놓고 exit를 안 해서 쌓인 듯하다.

for pid in $(ps aux | grep '/bin/sh' | grep -v grep | awk '{print $2}'); do kill -9 $pid; done

모든 /bin/sh 프로세스를 강제 종료한다.

깔끔해진 프로세스

앞으로 exit를 잘해야겠다.

/bin/shnode 중 어떤 프로세스가 문젠지는 모르겠다. GPT는 다음과 같이 답해준다.

더보기

1. /bin/sh 프로세스 문제

docker exec 명령을 실행할 때, 각 명령이 실행될 때마다 새로운 /bin/sh 세션이 생성됩니다. 이렇게 생성된 세션이 종료되지 않고 계속 유지되면, 예약된 작업에서 "이미 실행 중"으로 간주될 수 있습니다.

증상:

  • 예약된 작업은 새로운 작업을 실행하려 하지만, 이전 작업에서 생성된 /bin/sh 프로세스가 아직 남아 있는 경우, 시스템은 해당 프로세스를 "현재 작업 실행 중"으로 인식합니다.
  • 이 경우 "작업이 이미 실행 중입니다"라는 메시지를 출력하고 새로운 작업 실행을 건너뜁니다.

확인 방법:

docker exec <container> /bin/sh -c "ps aux" 명령으로 /bin/sh 프로세스 목록을 확인하세요.


2. node 프로세스 문제

npm start를 통해 실행된 Node.js 프로세스는 애플리케이션이 실행 중인 동안 종료되지 않습니다. 따라서 Node.js 애플리케이션이 실행 중일 경우, 예약된 작업이 새로 시작되지 않을 수 있습니다.

증상:

  • node 프로세스는 애플리케이션 실행을 담당하며, 종료되지 않은 상태에서 예약 작업이 다시 실행되면, "이미 실행 중"으로 간주될 수 있습니다.
  • 특히, docker exec를 통해 실행된 작업이 동일한 컨테이너에서 Node.js와 충돌할 가능성이 있습니다.

확인 방법:

docker exec <container> /bin/sh -c "ps aux | grep node" 명령으로 실행 중인 node 프로세스를 확인하세요.

어찌 됐든 스케줄러를 통해 실행하기 전에 node 던 /bin/sh 던 뭐라도 남아있다면 건너뛸 가능성이 있다는듯하다.

수정된 스케줄 명령어

docker exec <container> /bin/sh -c "
  echo '[INFO] 기존 /bin/sh 및 Node.js 프로세스 종료 중...';
  for pid in \$(ps aux | grep -E '/bin/sh|node' | grep -v grep | awk '{print \$2}'); do kill -9 \$pid; done;
  echo '[INFO] 기존 프로세스 종료 완료. 새 작업 시작.';
  cd /home/node/app && npm start
"
반응형