[오류 노트] kill 명령어로 프로세스 종료

오류 발생

REST API 실습을 위해 json-server를 실행했다.

  TodoApp + REST API (with JSON Server) json-server database/db.json --watch

  \{^_^}/ hi!

  Loading database/db.json
  Done

  Resources
  http://localhost:3000/todos
  http://localhost:3000/ediya-menu

  Home
  http://localhost:3000

  Type s + enter at any time to create a snapshot of the database
  Watching...

하지만 오류가 발생한다!!

address already in use 127.0.0.1:3000 → 이미 3000 포트를 사용하고 있다는 것이다.

Some error occurred Error: listen EADDRINUSE: address already in use 127.0.0.1:3000
    at Server.setupListenHandle [as _listen2] (net.js:1318:16)
    at listenInCluster (net.js:1366:12)
    at GetAddrInfoReqWrap.doListen [as callback] (net.js:1503:7)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:69:8) {
  code: 'EADDRINUSE',
  errno: -48,
  syscall: 'listen',
  address: '127.0.0.1',
  port: 3000
}

이럴 경우 구동하는 포트 번호를 3001와 같은 식으로 바꾸거나 이미 사용 되고 있는 3000의 서버를 강제 종료하면 된다.

해결 방법

kill 명령어로 프로세스 종료

서버를 구동시킨 상태에서 losf 명령어를 사용 입력한다. -i 옵션 뒤에 프로토콜과 포트를 명시해주면 TCP 3000번 포트를 사용하는 프로세스 정보가 출력된다.

lsof -i TCP:3000 

위 사진과 같이 정보가 출력된다. 여기서 확인 할 것은 실행된 node의 PID(process ID)이다. 58841번을 기억하고 이제 해당 프로세스를 중지해보자

서버를 구동 시켰을 때 명령어를 또 입력할 수 없다면?

터미널의 우측 상단에 이런 아이콘이 있다. 여기서 가운데 아이콘을 클릭하면 터미널 창이 하나 더 생긴다.

kill 명령어

kill -9 명령어를 사용하면 해당 프로세스가 중지 된다.

kill -9 (PID) 또는 kill -KILL (PID)

kill -9 명령어는 해당 프로세스를 즉시 종료하기 때문에 데이터 유실되거나 리소스가 제대로 안닫히는 문제가 발생할 수 있다.

권장하는 방법은 kill -TERM PIDkill -INT PID 같이 종료를 의미하는 signal 을 여러 번 전송해서 종료시킨다. 제대로 된 프로그램은 보통 cleanup 코드를 수행하고 종료하게 됩니다.

참고

Last updated