Profile picture

[Linux] 리눅스 명령어 ZIP

JaehyoJJAng2023년 03월 12일

◾️ 서버 살펴보기

각 디렉토리 별로 디스크 사용량 확인해보기

sudo du -shc /* 2>/dev/null
# du -h : 하위 디렉토리까지 표현
# du -sh : 해당 디렉토리만 표현
# du -ah : 파일에 대한 정보도 표현

기가 용량인 디렉토리 조회해보기

du -h --max-depth=1 | grep "^[0-9.]\+G"

서버의 공인 IP 확인해보기

curl -L wgetip.com

스크립트를 사용하여 서버 상세 정보 조회해보기

#### 조회 목록
## 물리 Storage 정보 조회
## 메모리 갯수 조회
## NIC 정보 조회
## 프로세스별 메모리 사용량 조회
## Routing table 조회
## cron 스케줄 정보 조회
## 방화벽 정보 조회
####
git clone https://github.com/woowacourse/script-practice
cd script-practice/script
sudo chmod 755 ./*
sudo bash ./server_resource.sh all

◾️ 파일 다루기

  • 파일 찾기 명령어 (find) 다뤄보기.

find 명령어 연습을 위해 Github 저장소를 clone하자.

git clone https://github.com/brainbackdoor/infra-workshop

파일 이름으로 파일을 찾아보자.

find ~/infra-workshop -name "*java"

find ~/infra-workshop -type f -user root \( -perm 4000 -o -perm -2000 \) -exec ls -lh {} \;

find ~/infra-workshop -type f -mtime -2 -exec ls -al {} \;

find ~/infra-workshop -type f -size 3M -exec ls -lh {} \;

◾️ 자바 프로세스 실행

  • 자바 설치 / 빌드 / 실행 / 로그 확인 과정 살펴보기

A. 자바 설치

which java
sudo apt update
sudo apt install default-jre
sudo apt install default-jdk

B. 빌드

git clone [저장소]
cd [저장소]
./gradlew clean build

# jar파일을 찾아본다.
find ./* -name "*jar"

C. 실행

java -jar [jar파일명] & 

# Application을 실행 후 정상적으로 동작하는지 확인해봅니다.
# 브라우저에서도 http://{서버 ip}:{port}로 접근해보세요.
curl http://localhost:8080
  • -Dserver.port=8000 옵션을 활용하여 port 변경이 가능
  • 서버 시작 시간이 너무 오래걸리는 경우 -Djava.security.egd 옵션을 적용해보자.
java -Djava.security.egd=file:/dev/./urandom -jar [jar파일명] &
  • 터미널 세션이 끊어질 경우, background로 돌던 프로세스에 hang-up signal이 발생해 프로세스가 죽는 경우가 종종 있는데, 이 경우 nohup 명령어를 활용
nohup java -jar [jar파일명] 1> [로그파일명] 2>&1 &

또는

nohup java -jar [jar파일명] 1> [success log 파일명] 2>[fail log 파일명] &

D. 로그 확인

# java applicaion이 남기는 로그를 확인합니다.
tail -f [로그파일명]
tail -f /var/log/syslog

# 파일을 압축하고 파일 소유자와 모드를 변경해봅니다.
tar -cvf [파일명] [압축할파일 또는 디렉터리]
sudo chown [소유자계정명]:[소유그룹명] [file이름] 
chmod [옵션] [파일명]

E. 실행 프로세스 종료

# 프로세스 pid를 찾아봅니다.
ps -ef | grep java
pgrep -f java

# 프로세스를 종료합니다. 
## why not use SIGKILL
## https://stackoverflow.com/questions/2541475/capture-sigint-in-java
kill -KILL [PID]
kill -KILL $(pgrep -f java)

◾️ 문제 상황 진단

  • 문제 상황 진단 시 자주 사용하는 명령어 정리
# 리눅스 방화벽 정책 확인
$ iptables -nL
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
## 리눅스 방화벽 정책 삭제 
$ sudo iptables -t nat -L --line-numbers
$ sudo iptables -t nat -D PREROUTING [라인 넘버]

# Ping 테스트
$ ping -c 5 -s 128 www.google.com  (c : 패킷 수, s : 패킷 사이즈)
$ traceroute google.com

# curl 테스트
$ curl -I google.com

# tcp dump 확인
$ tcpdump host 192.168.0.207
$ tcpdump port 80
$ tcpdump net 192.168

# 서버 리소스 및 프로세스 상태 확인
$ top

# 포트 상태 확인
$ netstat -antp | grep 8080

# 프로세스 확인
$ ps -auxfg
$ ps -ef 
# 메모리 사용량순 프로세스 보기
$ ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,cmd --sort -rss | head -n 11

# 라우팅 테이블 확인
$ ip route

# DNS 정보 확인
$ nslookup brainbackdoor.com

# 포트 상태 확인
$ telnet brainbackdoor.com 443

# 부하 상태 및 서버장비 uptime 시간 확인
$ uptime

# 메모리 상태 확인
$ free -m

◾️ 리눅스 서버 상태 파악

  • 리눅스 서버 상태 1분안에 파악하기

주로 CPU utilization, Available memory, RX / TX 패킷량, Disk 사용률, IOPS 등을 확인합니다.


1. 서버 상태를 파악하는데 필요한 도구를 설치해봅니다.
(https://b.luavis.kr/server/linux-performance-analysis)

$ sudo apt install sysstat

1. 우선, Load average를 확인합니다. 부하가 클 경우, 영향을 주는 프로세스를 확인합니다.

2. oom-killer 등 시스템 메시지가 발생한다면 dmesg 혹은 /var/log/syslog를 통해 확인할 수 있어요

3. vmstat를 통해 OS 커널에서 취득할 수 있는 정보를 확인해봅니다.

vmstat 5 5

procs -----------메모리---------- ---스왑-- ---입출력-- -시스템-- ------CPU-----
 r  b 스왑 가용 버퍼 캐시  입  출   입   출   in   cs us sy id wa st
 0  0      0 5398152 172996 1697260    0    0   105    22   75  164  0  1 99  0  0
 0  0      0 5398152 172996 1697260    0    0     0     0   79  122  0  0 100  0  0
 0  0      0 5398152 172996 1697260    0    0     0     1   78  117  0  0 100  0  0
 0  0      0 5398152 172996 1697260    0    0     0   353   99  115  0  0 100  0  0
 0  0      0 5398152 173004 1697244    0    0     0 10426   96  125  0  0 100  0  0
  • si, so : swap-in과 swap-out에 대한 값으로, 0이 아니라면 현재 시스템에 메모리가 부족하다는 의미입니다.
  • us, sy, id, wa, st : 각각 user time, 커널에서 사용되는 system time, idle, wait I/O 그리고 stolen time 을 의미합니다. stolen time은 hypervisor가 가상 CPU를 서비스 하는 동안 실제 CPU를 차지한 시간을 의미합니다.
  • I/O 대기와 관련해서는 wa 가 아닌, b 열을 참고합니다.

4. iostat을 통해 OS 커널에서 취득한 디스크 사용률을 알 수 있어요

iostat -xt

Linux 6.2.0-39-generic (jaehyo) 	20231222일 	_x86_64_	(2 CPU)

202312221638분 03초
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.08    0.01    0.66    0.06    0.00   99.18

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
loop0            0.00      0.00     0.00   0.00    0.00     1.21    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.00
loop1            0.30      1.42     0.00   0.00    0.06     4.80    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00    0.00    0.00   0.02
  • r/s, w/s, rkB/s, wkB/s : read 요청과 write 요청, read kB/s, write kB/s를 의미합니다.

5. free 명령어로 메모리 사용량을 확인할 수 있어요

free -wh

               총계         사용        여분      공유       버퍼          캐시    가용
메모리:      7.7Gi       799Mi       5.1Gi        13Mi       168Mi       1.6Gi       6.6Gi
스  왑:      2.0Gi          0B       2.0Gi
  • available : swapping 없이 새로운 프로세스에서 할당 가능한 메모리의 예상 크기

6,7. sar 명령어로 Network I/O, TCP stats 등을 확인할 수 있어요

sar -n DEV,TCP,ETCP 5

Linux 6.2.0-39-generic (jaehyo) 	20231222일 	_x86_64_	(2 CPU)

163930초     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
163935초        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
163935초     ens33      1.60      1.60      0.09      0.15      0.00      0.00      0.00      0.02
163935초 br-aeaddeee5444      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
163935초   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

163930초  active/s passive/s    iseg/s    oseg/s
1639350.00      0.00      1.60      1.60

163930초  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
1639350.00      0.00      0.00      0.00      0.00
  • rxkB/s : Total number of kilobytes received per second
  • txkB/s : Total number of kilobytes transmitted per second
  • active/s : TCP 연결이 CLOSED 상태에서 SYN-SENT 상태로 직접 전환 된 초당 횟수 즉, 서버에서 다른 외부 장비로 TCP 연결한 횟수
  • passive/s : TCP 연결이 초당 LISTEN 상태에서 SYN-RCVD 상태로 직접 전환 한 횟수 즉, 서버에 새롭게 접근한 클라이언트 수
  • retrans/s : 초당 재전송 된 총 세그먼트 수
    • 재전송은 통신 품질을 판단할 수 있는 기준입니다. 네트워크 장비 불량이나 설정에 이상이 있는 경우 재전송 현상이 나타나는 경우가 많습니다. 로컬 네트워크인 경우 재전송 비율은 0.01% 이하로 거의 없어야 하고, 원거리 네트워크에서도 0.5% 이하가 일반적입니다. 재전송이 빈번히 발생한다면 네트워크 구간별 응답시간을 조사해봅니다.

Loading script...