목차

     

     

     

    1. 특정 키워드가 들어간 문장만 찾고 싶을 때 (grep)

    $ cd /
    $ ls -al
    $ ls -al | grep media # ls -al 의 출력값 중에서 media가 들어간 문장만 출력
    $ ls -al | grep bin # ls -al의 출력값 중에서 bin이 들어간 문장만 출력

     

     

     

    $ cd /var/log
    $ cat README
    $ cat README | grep Alternatively # cat의 출력값 중에서 Alternatively 가 들어간 문장만 출력
    $ cat README | grep you # cat의 출력값 중에서 you 가 들어간 문장만 출력

     

     

     


     

    2. 리눅스에서 실행 중인 프로세스 조회하기 / 종료하기 (ps, kill)

    프로세스란?

     프로세스(process)실행 중인 프로그램 의미한다. 일반적으로 프로그램(program)이라는 용어가 익숙할 것이다. 하지만 운영체제를 학습하는데 있어서 프로세스(process) 라는 용어를 더 자주 쓰게 될 것이다. 왜냐하면 운영체제가 다루는 대상이 '저장된 코드'가 아니라 '실행 중인 코드'이기 때문이다. 프로그램(program) 이란 디스크 등에 저장된 실행 파일을 의미하고 프로세스(process) 실행중인 프로그램의 인스턴스 메모리와 CPU 자원을 실제로 점유하는 "실행 단위" 를 의미한다.

     

     

    리눅스에서 실행 중인  프로세스 조회하기

     리눅스에서도 윈도우에서 처럼 작업 관리자 창과 같이 실행 중인 프로그램들을 확인할 수 있는 명령어가 있다.

    # 실행 중인 모든 프로세스 조회
    $ ps aux

     

    •  USER  : 프로세스를 실행한 사용자
    •  PID  : 프로세스를 식별하기 위한 ID (Process ID)
    •  %CPU  : CPU 사용률
    •  %MEM  : 메모리 사용률
    •  COMMAND  : 프로세스를 실행할 때 사용한 명령어를 보여줌 → 어떤 프로세스인지 쉽게 파악할 수 있음
    하지만 모든 프로세스를 조회하다보니 보기가 불편하다. 그래서 아래와 같이 특정 키워드가 포함된 문장만 출력하게끔 명령어를 사용할 수 있다.
    # 예시
    $ ps aux | grep amazon

     

     

     

    프로세스 종료하기

     ps aux  명령어를 통해 실행 중인 프로세스를 조회한 뒤에, 종료하고자 하는 프로세스의 PID 값을 활용해서 종료하면 된다.

    $ kill [PID 값]

     

     

     


     

    3. 실행시킨 Spring Boot 프로세스를 조회하고 종료해보기

    실행시킨 Spring Boot 프로세스를 조회하고 종료해보기

    1) Spring Boot 서버 실행

    $ cd ~/linux-spring/build/libs
    $ java -jar linux-springboot-0.0.1-SNAPSHOT.jar

     

     

     

    2) 잘 작동하는지 확인

    http://{EC2 인스턴스의 Public IP 주소}:8080 주소로 접속

     

     

    3) 새로운 터미널 창 열어서 프로세스 조회해보기

     Spring Boot 서버를 실행시킨 채로 다른 명령어를 입력하려고 해도 작동하지 않기 때문에 새로운 터미널 창을 열어주자. ( 브라우저 새 탭에서 리눅스가 켜진 탭의 url 주소를 복사하면 새로운 터미널 창을 열수 있다.)
    그리고 다음 명령어를 입력하여 실행 중인 프로세스를 조회해보자.

    $ ps aux

     

     출력값을 살펴보면 익숙한 명령어 ( java -jar linux-springboot-0.0.1-SNAPSHOT.jar ) 가 보인다. 프로세스를 실행할 때 사용한 명령어가 출력된 것이다. 이 프로세스가 바로 Spring Boot 의 프로세스이다.

     

     하지만 실행중인 프로세스가 많다면 눈으로 찾기가 힘들다. 그래서 아래 명령어를 이용해 빠르게 실행 중인 Spring Boot 프로세스를 찾을 수 있다.

    $ ps aux | grep java

     

    이 명령어는 Spring Boot 서버를 실행한 이후에 프로세스가 죽지 않고 정상적으로 잘 실행됐는지를 확인할 때도 사용할 수 있다.

     

     

    4) Spring Boot 프로세스 종료하기

     실행 중인 Spring Boot 서버를 종료하기 위해서는 아래 명령어를 이용해 실행 중인 Spring Boot 프로세스의 PID 를 먼저 알아내야 한다.

    $ ps aux | grep java

     

     

    그 다음 PID를 이용해 아래와 같이 프로세스를 종료하는 명령어를 실행시키면 된다.

    $ kill 56021

     

     

    5) 정상적으로 종료되었는지 확인하기

     

         a. Spring Boot 서버를 실행시킨 터미널 창 확인하기

     

         b. IP 주소로 접속해보기

         c. 프로세스 조회해보기

    $ ps aux | grep java

     java -jar ...  로 시작하는 COMMAND 를 가진 프로세스는 조회되지 않는다. 즉 실행되고 있는 Spring Boot 서버는 없다는 뜻이다.

     

     


     

    4. 터미널 창을 끄더라도 프로그램이 계속 실행되도록 만들기 ( nohup, & )

    포그라운드( foreground ), 백그라운드( background ) 란?

    포그라운드( foreground )내가 실행시킨 프로그램의 내용이 화면에서 실행되고 출력되는 상태를 뜻한다. 그러다보니 포그라운드 상태에서는 다른 프로그램을 조작할 수가 없다.

     

    백그라운드 ( background )내가 실행시킨 프로그램이 컴퓨터 내부적으로 실행되는 상태를 의미한다. 그래서 프로그램이 어떻게 실행되고 있는지에 대한 정보가 화면에 자동으로 출력되지는 않는다. 이런 특성 때문에 다른 명령어를 추가로 입력할 수도 있고, 새로운 프로그램을 조작할 수도 있다.

     

     

    백그라운드( background ) 로 Spring Boot 를 실행시켜 보자

    1) Spring Boot 를 백그라운드에서 실행하기

     

     프로세스를 백그라운드에서 실행시키려면 명령어의 앞 부분에  nohup  을 붙이고, 뒷 부분에  를 붙이면 된다.

    $ nohup java -jar linux-springboot-0.0.1-SNAPSHOT.jar &

     

    위 명령어를 입력한 뒤에 Enter 를 눌러보면 새로운 명령어를 입력할 수 있다.

     

    2 ) Spring Boot 서버가 잘 실행되고 있는지 확인하기

     

         a. IP 주소로 접속해보기

         

         b. 리눅스 명령어로 확인해보기

    $ ps aux | grep java

     

     

     

    정리

     서버를 실행시킬 때 24시간 내내 터미널 창을 켜놓을 순 없다. 따라서 서버를 실행시킨 뒤에 터미널 창을 끄더라도 프로세스가 계속 실행되어야 한다. 그럴 때 아래 명령어를 활용하여 백그라운드에 프로세스를 실행시키면 된다.

    $ nohup [프로그램을 실행하는 명령어] &

     

     


     

    5. 백그라운드에서 실행되고 있는 프로세스의 로그 확인하는 법 ( nohup )

    백그라운드에서 실행되고 있는 프로세스의 로그 확인하는 법

    1) 이전에 실행시킨 Spring Boot 종료하기

    $ ps aux | grep java
    $ kill [PID 값]

     

     

    2) 포그라운드에서 Spring Boot 실행시켜보기

    $ cd ~/linux-springboot/build/libs
    $ java -jar linux-springboot-0.0.1-SNAPSHOT.jar

     

     포그라운드에서 Spring Boot 를 실행시켜보면 Spring Boot 가 출력하는 로그를 실시간으로 확인할 수 있다. 이 로그를 보면서 Spring Boot 가 정사적으로 실행된 건지 안 되었는지 직접적으로 확인할 수 있다.

     

     

    3) 백그라운드에서 Spring Boot 실행시켜보기

    $ nohup java -jar linux-springboot-0.0.1-SNAPSHOT.jar &

     

     

     백그라운드에서 Spring Boot 를 실행시켜보면 포그라운드와 달리 실시간으로 로그가 찍히지 않는다.

     

    그렇다면 Spring Boot 가 출력하는 로그는 어디에서 확인해야 하는가?

     

     nohup  이라는 명령어로 프로그램을 실행시키면  nohup.out  이라는 파일에 로그가 쌓이게끔 작동한다.  nohup  명령어를 입력한 뒤에 찍히는 출력값을 자세히 읽어보면 아래와 같이 작성되어 있다.ㅣ

     

     ... appending ouput to 'nohup.out' 

     

     프로세스에서 발생한 출력값을  nohup.out  이라는 파일에 추가해서 저장하겠다는 의미이다. 실제로 그런지 확인해 보자.

     

     

    4)  nohup.out  파일 확인해 보기

     확실한 테스트를 위해 기존에 실행시키던 Spring Boot 서버를 종료하고 기존  nohup.out  파일을 삭제한 뒤에 확인해 보자.

    # Spring Boot 프로세스 종료하기
    $ ps aux | grep java
    $ kill [PID 값]
    
    # 기존 nohup.out 파일 삭제
    $ ls
    $ rm -rf nohup.out
    $ ls # 잘 삭제되었는지 확인
    
    # 백그라운드에서 Spring Boot 실행시키기
    $ nohup java -jar linux-springboot-0.0.1-SNAPSHOT.jar &
    $ ls # nohup.out 파일 생성되었는지 확인
    $ cat nohup.cat # 파일 확인해보기

     

     nohup.out  파일을 확인해보면 백그라운드에서 실행된 프로세스의 로그가 파일에 기록된 것을 확인할 수 있다.

     

     

    그렇다면  nohup.out  파일 말고 다른 파일에 로그를 남기려면 어떻게 해야할까?

     

     nohup.out  파일이 아닌 다른 파일에 로그가 남도록 만들기

    $ rm -rf nohup.out  # 확실한 테스트를 위해 기존 nohup.out 파일 삭제
    $ nohup java -jar linux-springboot-0.0.1-SNAPSHOT.jar >> result.log 2>&1 &
    $ ls
    $ cat result.log

     

     Sprint Boot 프로세스에서 발생한 로그 (표준 출력과 표준 에러 출력) 를  result.log  파일로 전달하게 만드는 명령어이다. 그리고  대신에  >>  를 쓴 이유는 파일을 매번 새로 덮어쓰는 것이 아닌, 기존 파일에 이어서 로그를 쌓아가게끔 만들고 싶어서이다.
    아래에서 result.log  파일을 확인해보면 정상적으로 로그가 저장된 것을 확인할 수 있다. 

     

    위의 로그를 잘 살펴보면  Port 8080 was already in use  라는 에러 메시지가 로그로 남아있다.
    아래에서는 왜 이런 에러 메시지가 뜨고 해결하는 방법에 대해서 알아보자.

     

     


     

    6. 특정 포트 번호에 실행되고 있는 프로세스 조회하기 / 포트 충돌 해결하기 ( lsof )

    포트( Port ) 란?

     포트( Port )한 컴퓨터 내에서 실행되고 있는 특정 프로그램의 주소를 의미한다.

    하나의 컴퓨터에는 총 65536개 (0 ~ 65535)의 포트 번호를 가지고 있다. Spring Boot 와 같은 백엔드 서버를 실행시킬 때 어떤 포트에서 실행시킬 지 정해야 한다. 만약 아무런 설정을 하지 않으면 Spring Boot 는 기본적으로 8080번 포트에서 실행되도록 작동한다.

    주의할 점은 하나의 포트에는 단 하나의 프로세스만 실행시킬 수 있다는 점이다. 예를 들어, 8080번 포트에 이미 Spring Boot 서버가 실행되고 있다고 가정하자. 그런데 Node.js 서버를 8080번 포트에 띄우려고 하면 에러가 발생한다. 왜냐하면 8080 포트에 이미 Spring Boot 프로세스가 실행되고 있기 때문이다. 

     

     

    에러 원인 해석하기

     

     Port 8080 was alread in use 

    → 8080번 포트를 이미 사용하고 있다고 한다. 즉, 8080번 포트에서 어떤 프로그램이 이미 실행되고 있다는 뜻이다.
    그래서 Spring Boot 를 실행시키려고 하는데 에러가 발생한 것이다.

     

    그렇다면 8080번 포트에서 어떤 프로그램이 실행되고 있는지 확인하려면 어떻게 해야 할까?

     

     

    특정 포트 번호에 실행되고 있는 프로세스 조회하기

    # sudo lsof -i:[포트번호]
    $ sudo lsof -i:8080

     

    주의)  sudo  를 붙여야만 시스템 내의 모든 프로세스를 기반으로 특정 프로세스를 조회해준다.

     

     

    8080번 포트에 실행되고 있는 프로세스가 조회됐다. 조회된 프로세스에서 2가지 항목을 살펴보자.

    •  COMMAND  : 프로세스를 실행시킬 때 사용한 명령어의 '일부'만 보여준다.
    •  PID  : 프로세스를 식별하기 위한 ID

     여기서 어떤 프로세스인지  COMMAND  의 값의 일부인  java  라는 키워드만 보고 유추할 수 있다면 상관없는데,
    정확히 어떤 프로세스인지 모르겠다 싶을 땐  COMMAND  의 전체를 볼 필요가 있다.

    그럴 땐  COMMAND  의 전체 값을 보여주는  ps aux  명령어를 활용하면 된다.
    아래 명령어를 이용해 PID 가  58158  인 프로세스만 찾아 조회하는 것이다.

     

    # 실행 중인 모든 프로세스 조회 + 58158 라는 키워드가 들어간 문장만 출력
    $ ps aux | grep 58158

     

     그러면 구체적으로 어떤 명령어를 통해 프로세스를 실행시킨지 파악할 수 있고, 그럼으로써 어떤 프로세스가 실행되고 있는지 좀더 명확하게 파악할 수 있다.

     

     

    특정 포트 번호에 실행되고 있는 프로세스 종료하기

    8080번 포트에 내가 원하는 프로세스를 실행시키기 위해, 기존에 8080번 포트에 실행되고 있는 프로세스를 종료시켜보자.

    # sudo lsof -i:[포트번호]
    $ sudo lsof -i:8080

     

     

    위 명령어를 통해 8080번 포트에서 실행되고 있는 프로세스의 PID 값을 알아내고  kill  명령어를 통해 프로세스를 종료시키면 된다.

    $ kill 58158

     

     

    정상적으로 프로세스가 잘 종료 되었는지 확인

    $ sudo lsof -i:8080

     

     

     


     

    7. 서버가 잘 작동하는 지 API 요청 보내보기 ( curl )

    서버가 잘 작동하는 지 API 요청 보내보기 ( curl )

    실제 백엔드 서버를 띄우고나서 테스트 할 때 많이 활용하는 툴로 포스트맨( Postman)이 있다. 포스트맨 (Postman) 을 활용하면 다양한 형태의 API 요청을 보낼 수 있어 테스트하기가 용이하다.

    리눅스에서도 포스트맨(Postman) 과 같은 역할을 하는  curl  이라는 명령어가 있다. 
    curl  명령어를 활용하면  GET POST PUT DELETE  등 포스트맨(Postman)처럼 다양한 형태로 요청을 보낼 수 있다.

     

    [예시]

    # GET 형식
    $ curl http://example.com/api/data
    
    # POST 형식
    $ curl -X POST http://localhost:8080/api/users \
         -H "Content-Type: application/json" \
         -d '{"name": "홍길동", "email": "gildong@example.com"}'
    
    # PUT 형식
    $ curl -X PUT http://localhost:8080/api/users/1 \
         -H "Content-Type: application/json" \
         -d '{"name": "홍길동", "email": "gildong@example.com"}'
         
    # 등등

     

    그런데 위 예시를 보면  GET  요청을 제외하고는 명령어가 다소 복잡하기 때문에, 간단하게  GET  요청으로만 API 를 테스트하면 될 때에만  curl  을 사용한다.

     

     

    1. 리눅스 환경에서 실행시킨 서버가 정상적으로 작동하는 지 체크하고 싶을 때

    $ curl localhost:8080 # Spring Boot 서버가 내부에서 잘 실행되고 있는 지 체크
    $ curl [EC2 퍼블릭 IP]:8080 # Spring Boot 서버가 외부 IP로도 요청이 되는 지 체크
    
    $ curl localhost:9999 # 잘못된 주소로 요청보내보기

     

     

    브라우저에서 직접 켜서 테스트해보거나 포스트맨을 켜서 테스트 할 필요없이 간단하게   curl  명령어를 이용하여 테스트해볼 수 있다.

     

     

    2. 외부의 API 서버가 잘 작동하는지 체크하고 싶을 때

    $ curl https://jsonplaceholder.typicode.com/posts # 샘플 API 주소

     

     


     

    8. 내 IP 주소 확인하기 ( ip )

    내 IP 주소 확인하기 ( ip )

    IP 란 네트워크 상에서의 특정 컴퓨터를 가리키는 주소를 의미한다. 아래와 같은 값이 IP 주소이다.

     13.250.15.132 

     

     

     AWS에서 제공하는 터미널 창에서는 Public IP 와 Private IP를 둘 다 알려준다. 하지만 일반적인 터미널 창에서는 IP를 표시해주지 않기 때문에, IP를 명령어로 알아낼 수 있어야 한다. 

    cf) Public IP, Private IP란?
    - Public IP : 외부 인터넷을 통해 접근할 수 있는 IP
    - Private IP : 같은 네트워크 안에서만 접근할 수 있는 IP

     

     

     

    [Public IP 주소 알아내는 법]

    $ curl ifconfig.me

     이전에  curl  에 대해 설명했다.  curl  은 특정 주소로 API 요청을 보낼 때 사용하는 명령어라고 얘기했다. 위 명령어는  ifconfig.me  라는 URL 로 GET 요청을 보내는 명령어다.  ifconfig.me  라는 사이트는 내 컴퓨터의 IP 주소를 알려주는 사이트다.

     

    브라우저에서  ifconfig.me  주소로 접속해봐도 IP 주소를 알려준다는 것을 확인할 수 있다.

     

     

    [Private IP 주소 알아내는 법]

    $ ip a

     

     

     ip a  명령어를 입력한 뒤 2번째  inet  뒤에 있는 값이 Private IP 주소이다.

     

     

     


     

    9. 컴퓨터가 느려질 때 CPU, Memory 성능 체크해서 원인 파악하기 ( top )

    컴퓨터가 느려질 때 CPU, Memory 성능 체크하기 ( top )

     우리가 사용하는 컴퓨터도 동시에 여러 프로그램을 많이 키면 속도가 느려질 때가 있다. 그럴 때 작업 관리자 창을 켜서 어떤 프로그램이 렉을 걸리게 하는 지 파악할 수 있다. 컴퓨터는 CPU나 메모리가 부족하면 렉이 걸리기 때문에 CPU 또는 메모리의 사용률이 높은 프로그램이 컴퓨터를 느려지게 만든 프로그램일 가능성이 높다.

     

     이처럼 리눅스 운영체제에서도 작업 관리자 창처럼 CPU 와 메모리 성능을 체크할 수 있는 기능이 있다. 아래의 명령어를 입력해서 실행시켜보자.

    $ top

     

    1.  %CPU(s)  의 항목에서  id  부분의 값이 CPU 의 여유 정도를 나타낸다.  99.7 id 라는 뜻은 컴퓨터에서 여유로운 CPU 비중이 99.7% 라는 뜻이다. 만약 이 값의 숫자가 작다면 컴퓨터가 버벅거릴 가능성이 크다.
    2.  Mib Mem  의 항목에서  free  부분의 값은 남아있는 메모리의 크기를 나타낸다.  538.4 free  라는 뜻은 539.4MB 만큼의 사용할 수 있는 여분의 메모리가 있다는 뜻이다. 만약 이 값의 숫자가 0에 가깝다면 컴퓨터가 버벅거릴 가능성이 있다.
    3. 1,2번의 수치를 확인했을 때 CPU 또는 메모리가 부족하다면 어떤 프로세스에서 CPU랑 메모리를 많이 잡아먹고 있는 지 파악해야 한다. 나열되어 있는 프로세스 중 CPU 또는 메모리의 사용률이 높은 프로세스가 있는지 체크하고 PID를 이용해 종료시키면 된다. 편리하게도  top  명령어가 CPU 사용률이 높은 프로세스를 알아서 상위로 노출시켜준다.

     

     


     

    10. 로그 실시간으로 확인하는 법 (tail -f )

    로그 실시간으로 확인하는 법 ( tail - f )

     AWS EC2 에서 만든 Ubuntu 컴퓨터에서 접속할 때마다 로그가 쌓이는  /var/log/auth.log  라는 파일이 있다.
    그 파일을 먼저 열어서 살펴보자.

    $ cd /var/log
    $ ls
    $ vi auth.log # ctrl +f, ctrl + b 명령어를 통해 파일을 살펴보자

     

    지금까지 쌓인 로그를 볼 때는 위 명령어로 볼 수 있지만 현재 실시간으로 로그가 어떻게 쌓이고 있는 지 봐야할 수도 있다.
    그럴 땐 아래의 명령어를 사용하면 된다.

     

    # tail -f [파일명]
    $ tail -f auth.log # 파일의 마지막 10줄을 출력 + 실시간으로 파일에 추가되는 내용을 출력

     

    위 명령어를 입력한 채 새로운 브라우저 창에서 Ubuntu 컴퓨터에 접속해보자.

     

    새로운 브라우저 창에서 Ubuntu 컴퓨터에 접속하는 순간 로그가 쌓이는 것을 실시간으로 확인할 수 있다. 그리고 새로운 브라우저 창에서 계속 새로고침 할 때마다 로그가 쌓인다.

     

    이와 같이 특정 파일에 로그가 실시간으로 어떻게 쌓이는지 확인하고 싶을 때는  tail -f  명령어를 사용하면 된다.

     

    + Recent posts