리눅스 (nohup 명령어 / 포트죽이기)
- nohup
aws를 이용해서 배포를 해보다가, nohup이라는 명령어를 알게 됬다. nohup 명령어는 백그라운드 실행을 원할 때나,
표준 출력을 nohup.out으로 돌리기 위해서 사용한다.
사용방법
- nohup 실행파일
- nohup 실행파일 & (백그라운드 실행)
2가지 형태로 사용할 수 있다.
명령어의 뒤에 &를 입력하면 백그라운드에서 명령어가 실행되게 할 수 있다. 하지만 이렇게 수행했을 경우 사용자가 로그아웃 하면 프로그램이 종료되게 된다. 이 때 nohup 명령어를 같이 사용하면 사용자가 로그아웃해도 백그라운드에서 프로그램이 계속 돌아가게 된다.
nohup으로 백그라운드에서 동작하고 있는 프로그램을 중단시키려면 kill명령어를 사용해야 한다.
- 포트죽이기
종종 서버를 런 시키면 포트가 사용중이라는 에러가 나타날 때가 있는데, 이 때는 kill 명령어를 이용해서 포트를 죽이고 다시 서버를 런 시키면 에러가 해결된다.
먼저 사용중인 포트를 확인하기 위해서, netstat 명령어를 사용할 수 있다.
netstat(network statistics)
전송 제어 프로토콜, 라우팅 테이블, 수많은 네트워크 인터페이스, 네트워크 프로토콜 통계를 위한 네트워크 연결을 보여주는 명령어. 네트워크의 문제를 찾아내고 성능 측정으로서 네트워크 상의 트래픽의 양을 결정하기 위해 사용된다.
-a : 현재다른PC와 연결(Established)되어 있거나 대기(Listening)중인 모든 포트 번호를 확인
-r : 라우팅 테이블 확인 및 커넥션되어 있는 포트번호를 확인
-n : 현재 다른PC와 연결되어 있는 포트번호를 확인
-e : 랜카드에서 송수한 패킷의 용량 및 종류를 확인
-s : IP, ICMP, UDP프로토콜별의 상태 확인
-t : tcp protocol
-u : udp protocol
-p : 프로토콜 사용 Process ID 노출
-c : 1초 단위로 보여줌
netstat과, 리눅스에서 특정 문자열을 찾을 때 사용되는 grep 키워드를 이용해서
netstat -nap|grep 8080
8080포트를 찾을 수 있다.
현재 listen상태인 8080포트를
sudo kill $(sudo lsof -t -i:8080)
를 이용해서 죽이면
TIME_WAIT상태로 바뀐것을 확인할 수 있다.
- deploy.sh
#!/bin/bash
REPOSITORY=/home/ec2-user/app/git
cd $REPOSITORY/springboot-webservice/
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> Build 파일 복사"
cp ./build/libs/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f springboot-webservice)
echo "$CURRENT_PID"
if [ -z $CURRENT_PID ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -2 $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 5
fi
echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls $REPOSITORY/ |grep 'springboot-webservice' | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME &
위 쉘 스크립트가 배포를 위해 향로님 블로그에서 참고한 파일인데, 이를 보면 kill과 nohup명령어가 배포를 위한 스크립트를 만들 때 사용되는 것을 확인할 수 있다.
- 참고
https://jhhwang4195.tistory.com/182