podman 컨테이너가 자꾸 강제 종료되길래 컨테이너를 재가동하고 로그를 찍어봤다.

1
2
3
4
5
6
7
8
# 컨테이너 가동
podman start [컨테이너 명]

# 가동중인 컨테이너 확인
podman ps

# 컨테이너 내부의 로그를 확인
podman log [컨테이너 명]

콘솔 확인 결과, 아래의 스택오버플로우 포스트처럼 pm2에서 코드 0 으로 종료된다는 문구가 출력됐다.

https://stackoverflow.com/questions/58947629/node-js-pm2-log-app-server0-exited-with-code-0-via-signal-sigkill

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[RSS]Time 60min Call Complete.
RSS Timer::60 call complete.
{
generation_event: 'sitemap',
origin_commander: 'timer',
is_timer: 30
}
[Sitemap]Time 30min Call Complete.
Sitemap Timer::30 call complete.
2023-05-18T05:59:41: PM2 log: App name:app id:0 disconnected
2023-05-18T05:59:41: PM2 log: App [app:0] exited with code [0] via signal [SIGTERM]
2023-05-18T05:59:41: PM2 error: Error caught while calling pidusage
2023-05-18T05:59:41: PM2 error: Error: ESRCH: no such process, read
2023-05-18T05:59:41: PM2 error: Error caught while calling pidusage
2023-05-18T05:59:41: PM2 error: Error: ESRCH: no such process, read
2023-05-18T05:59:41: PM2 error: 0 : id unknown
2023-05-18T05:59:41: PM2 error: Trace: Error: 0 : id unknown
at God.logAndGenerateError (/usr/local/lib/node_modules/pm2/lib/God/Methods.js:39:12)
at God.stopProcessId (/usr/local/lib/node_modules/pm2/lib/God/ActionMethods.js:289:21)
at God.deleteProcessId (/usr/local/lib/node_modules/pm2/lib/God/ActionMethods.js:366:9)
at Server.onmessage (/usr/local/lib/node_modules/pm2/node_modules/pm2-axon-rpc/lib/server.js:104:6)
at RepSocket.emit (node:events:513:28)
at RepSocket.emit (node:domain:489:12)
at Parser.<anonymous> (/usr/local/lib/node_modules/pm2/node_modules/pm2-axon/lib/sockets/rep.js:51:15)
at Parser.emit (node:events:513:28)
at Parser.emit (node:domain:489:12)
at Parser._write (/usr/local/lib/node_modules/pm2/node_modules/amp/lib/stream.js:91:16)
at God.logAndGenerateError (/usr/local/lib/node_modules/pm2/lib/God/Methods.js:34:15)
at /usr/local/lib/node_modules/pm2/lib/God/ActionMethods.js:367:30
at God.stopProcessId (/usr/local/lib/node_modules/pm2/lib/God/ActionMethods.js:289:14)
at God.deleteProcessId (/usr/local/lib/node_modules/pm2/lib/God/ActionMethods.js:366:9)
at Server.onmessage (/usr/local/lib/node_modules/pm2/node_modules/pm2-axon-rpc/lib/server.js:104:6)
at RepSocket.emit (node:events:513:28)
at RepSocket.emit (node:domain:489:12)
at Parser.<anonymous> (/usr/local/lib/node_modules/pm2/node_modules/pm2-axon/lib/sockets/rep.js:51:15)
at Parser.emit (node:events:513:28)
at Parser.emit (node:domain:489:12)
2023-05-18T05:59:41: PM2 log: PM2 successfully stopped

컨테이너 위에서 돌아가고 있는 프로그램은 Express API 서버였고, 스케쥴러처럼 특정 시간대에 트리거를 하는 로직을 수행하고 있었다.

동일한 작동 방식으로 짜인 다른 컨테이너도 해당 오류가 일어나지 않았는데 왜 이 컨테이너만 이런 문제가 일어났을까?

컨테이너의 Express 서버는 AWS의 Lambda를 호출하고 있었는데, 이 Lambda는 파일 생성이라는 다소 무거운 작업을 수행한다.

  • axios 요청에서 타임아웃을 내지 않더라도, 요청 시간이 너무 길어지면 프로세스가 죽은 것임으로 간주하고 pm2가 강제 종료를 수행한다.

해당 내역때문에 lamdba의 헤비한 로직을 비동기로 처리하고, 응답을 먼저 돌려주는 방식으로 바꾸었다.