Dev

address already in use 에러 해결하기 ( awk와 함께 )

hou27 2022. 4. 2. 15:45

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 중인 것들을 확인한 결과 정상적으로 실행되었음을 확인할 수 있었다.

 

성공!!

 

이번에 작성한 명령어 한줄을 별칭등록해두면 유용하게 쓸 수 있을 것 같다.