Node.js와 함께 작업하다보면 가끔
Error: listen EADDRINUSE: address already in use :::[Port]
이런 에러를 만날 때가 있다.
이는 비정상종료로 인해서 해당 포트가 점유되고 있어 사용할 수 없을 때 나타나는 에러이다.
평소 우리는 이 에러를 해결하기 위해 kill 명령어를 통해 해당 프로세스를 죽여서 해결하곤 했는데,
그 프로세스를 죽이기 위해선 PID 정보가 필요하다.
위와 같이 PID 정보를 확인해야
그제서야
kill -9 [PID]
를 통해 죽일 수 있었는데,
매번 그 과정이 너무 귀찮아서 생각하던 중 awk가 떠올랐다.
awk
awk란 pattern scanning and processing language이다.
파일의 각 열을 읽어 데이터를 원하는 대로 할 수 있는 프로그램이다.
awk 'pattern {action}'
기본적으로 위와 같이 사용할 수 있으며
이 친구를 활용하여 명령어 한 줄로 특정 포트를 점유하고 있는 친구를 죽여보도록 할 것이다.
일단 점유당한 포트를 grep해주면 위와 같이 PID 8510에 의해 점유되고 있는 것을 확인할 수 있다.
그렇다면 우리는 저 8510이라는 숫자가 필요하다.
7번째 값이기 때문에
awk '{print$7}'
위와 같이 사용하면 해당 값 만을 출력할 수 있다.
그러나
확인할 수 있듯이 8510/node가 필요한게 아니라 오직 PID만이 필요하다.
어떻게 해야할까?
다행히도 awk는 변수도 사용할 수 있으며 여러 내장형 함수도 사용할 수 있는데,
그 중 split이라는 함수도 존재한다.
split(string, array, separator)
separator 값을 기준으로 string을 분할하여 array에 넣어주는 함수이다.
split함수를 통해 7번째 값을 문자열 '/'로 분할한 후, 해당 값을 result에 넣어주고
그 배열에 담긴 우리가 원하던 값을 출력해주었다.
이제 저 값을 이용하여 프로세스를 kill하기만 하면 성공이다.
저 값을 이용하기 위해서 xargs 명령어를 사용할 것이다.
xargs는 명령의 출력을 다른 명령의 argument로 넘겨주는 명령어이다.
netstat -antp | grep 3000 | awk '{split($7,result,"/"); print result[1]}' | xargs kill -9
netstat -antp | grep 3000 | awk '{split($7,result,"/"); print result[1]}'
의 출력인 PID를
kill -9의 arg로 넘겨주게 되어 결국
kill -9 8510
위 명령이 실행되는 것이다.
명령어를 통해 죽이고 LISTEN 중인 것들을 확인한 결과 정상적으로 실행되었음을 확인할 수 있었다.
성공!!
이번에 작성한 명령어 한줄을 별칭등록해두면 유용하게 쓸 수 있을 것 같다.
'Dev' 카테고리의 다른 글
Dependency Injection(의존성 주입 - DI)란? (0) | 2022.05.07 |
---|---|
Github Copilot 설정하기 (2) | 2022.04.25 |
TypeORM - 버전 0.3 && ORM이란? (0) | 2022.03.28 |
WSL2 - 정적 ip 할당하기 && NIC Bridge mode (5) | 2022.03.08 |
Linux alias(별칭 지정) 명령어 영구 등록 (0) | 2022.02.14 |