Linux Shell Study

cd (change deirectiory)

: 현재 작업 디렉토리를 지정한 디렉토리로 변경

cd ~

ls (list)

: 현 디렉토리의 파일 목록을 출력

ls -al, 1, h, t, r

ls -al | awk '{print $9}'

df (disk free)

: 마운트된 모든 장치에 대한 현재의 디스크 공간 통계를 출력

df -h, T, i

mkdir (make derectory)

: 디렉토리를 생성

rmdir (remove directory)

: 디렉토리를 삭제

pwd (print working directory)

: 현재 위치한 디렉토리의 절대경로를 출력

mount

: 디스크 장치를 표시하거나 가상 파일 시스템으로 지정한 디렉토리를 연결(마운트)

mount -t share 10.0.101.3/share /share

unmount /share

stat

:지정한 파일의 파일통계를 출력

touch

: 지정한 이름의 비어있는 파일을 생성하거나 파일이 있는 경우 타임스탬프를 업데이트

cat (catenote)

: 지정한 파일의 내용을 출력

head (<-> tail)

: 지정한 파일의 1라인부터 지정한 라인까지 출력 (기본지정값 10)

head -n 10

tail -f, -F(현재 쓰고있는 로그파일에 경우, 쓰기가 실행되면 다시 로드하여 출력함)

cp (copy)

: 지정한 파일을 지정한 위치와 이름으로 복사

cp -rfp 원본파일패스 /이름 복사할파일패스 /이름

mv (move)

: 지정한 파일을 지정한 위치와 이름으로 이동

rename

: 지정한 규칙에 따라 여러 개의 파일 이름을 변경

rename 변경전파일명 변경후파일명 대상파일

rename test test0 test?

rename test0 test test0?

rm (remove)

: 지정한 파일을 삭제

rm -rf

less

:상하로 커서 이동이 사능한 파일보기

ln (link)

: 지정한 파일에 대한 심볼릭링크나 하드링크를 생성

ln 옵션 링크의원본파일패스 /이름 링크파일패스 /이름

옵션이 없으면 하드링크,

-s는 심볼릭링크(윈도우의 바로가기와 같음)

paste

: 지정한 파일드의 행을 읽어 탭으로 구분하여 병합

dd (datrset dafinition)

: 블록 단위로 데이터셋을 정의하여 파일을 쓰고 읽음

dd if=인풋파일이름 of=아웃풋파일이름 bs=바이트(크기) count=블럭을복사할횟수

ibs, obs <-- bs

/dev/zero, /dev/urandom

tar (tape archive)

: 지정한 데이터 및 디렉토리를 하나의 파일로 만듬

tar -cvzf 타르볼파일명 디렉토리명/파일명

tar -xvzf 타르볼파일명

tar -tf 타르볼파일명

ps (process status)

: 시스템에서 실행 중인 프로세스에 대한 정보를 출력

ps -ef

ps aux

ps axfwwwww <-- w 갯수에 따라 출력하는 명령어 줄이 길어짐

pstree (process status tree)

: 시스템에서 실행 중인 프로세스에 대한 정보를 트리구조로 출력

top

: 프로세스 목록을 일정 시간마다 새로고침하여 화면에 출력하는 툴, 시스템 전반적인 상황을 모니터링 할 수 있음

us(유저), sy(시스템), ni(나이스값), id (유휴), wa(대기), hi(하드웨어인터럽트루틴), si(소프트웨어인터럽트루틴), st(스틸-하이퍼바이저)

1(core별), m(memory), k(kill)

nohup (no hangup)

: 쉘 스크립트 파일을 데몬 형태로 실행, 표준 출력을 지정한 파일로 리다이렉트

kill

: 지정한 프로세스에 지정한 시그널을 보내 프로세스 종료

int, term, kill

kill -2 프로세스번호

kill -INT 프로세스번호

kill -15 프로세스번호

kill -TERM 프로세스번호

kill -9 프로세스번호

kill -KILL 프로세스번호

ifconfig (interface configration)

: 네트워크 인터페이스의 활성/비활성화 및 설정

ip

: ip 관련 정보 조회 및 설정

네트워크 설정파일

/etc/sysconfig/network-scripts

/etc/network/interfaces

netstat (network statistics)

: 네트워크 프로토콜의 통계와 연결상태를 출력

netstat -nltpu

netstat -tanu

/etc/services

ss (socket statistics)

: 네트워크 소켓의 통계와 연결상태를 출력

ss -nltpu

cat /etc/redhat-release

iptables

: 패킷 필터링 도구로 패킷의 출입을 제한하는 방화벽구성이나 NAT(network address translation)구성에 사용

iptables -nL

systemctl status iptables

ufw (uncomplicated firewall)

: iptables의 제어를 쉽게 하기 위한 도구

ping

: ICMP 프로토콜의 응답 확인 도구

ping -c 횟수

wget (world wide web + get)

: 웹서버로부터 컨텐츠를 가져오는 도구

curl (client for urls)

: 다양한 프로토콜을 사용하여 데이터를 전송하게 해 주는 도구

curl -Lkso /dev/null -w "%{http_code}\n" 주소

route

: 네트워크의 경로 정보(라우팅 테이블)의 출력, 변경하는 도구

route -n

route add/del

find

: 지정한 파일명 또는 정규표현식을 이용하여 파일을 검색

find 옵션 찾기시작할패스 익스프레션

find ./ -name test

name, type f/d, perm, empty

which

: 환경변수 PATH에 등록된 디렉토리에 있는 명령어를 찾아주는 도구

echo ${PATH}

grep (global / regular expression / print)

:텍스트 검색 기능을 가진 도구, 파일이나 표준 입력을 검색하여 지정한 정규 표현식과 맞는 줄을 출력

grep 옵션 "찾을문자열" 파일명

grep -ir

-c(총 글자수), -v(특정 문자 제외)

/var/log/messages

/var/log/syslog

history

: 명령어를 수행한 목록을 출력/조작

~/.bash_history

redirection

: 표준 스트림 (stdin, stdout, stderr)을 부등호를 사용하여 지정한 위치로 보낼 수 있는 방향지정 옵션

명령 리다이렉션기호 파일명

echo a > a

echo b > a

echo zzz >> a

echo kkk >| test <-- '>'만 사용해서 쉘스크립트 작성시 에러

> 초기화, >> 추가, >| 추가(쉘스크립트)

echo

: 문자열을 출력하는 도구

echo 문자열

chmod (change mod)

: 파일이나 디렉토리의 모드(접근권한)을 변경하는 도구

chmod 권한정보 파일명

rwx421

chown (change the owner of a file)

: 파일의 소유권을 바꾸기 위한 도구

chown 소유자명:그룹명 파일/디렉토리이름

sudo (superuser do --> substitude user do

: root 사용자의 보안 권한을 이용하여 명령 또는 프로그램을 실행하는 도구

who

: 현재 시스템에 로그인한 사용자 목록을 출력

w

date

: 현재의 날짜와 시간을 출력

date -d '-1 day'

date -d '1 day ago'

week / month / hour / minute / second

연-월-일 시:분:초

date '+%Y-%m-%d %H:%M:%S'

date '+%Y%m%d'

seq (sequence)

: 지정한 규칙으로 숫자열을 출력하는 도구

seq 시작숫자 끝숫자

seq -w 1 10

seq -f %0자릿수g

more

: 한 화면씩 지정한 파일의 내용을 출력하는 도구

whatch

: 지정한 명령어를 지정한 시간(초)마다 재실행하여 화면에 출력하는 도구

crontab

: 리눅스의 잡 스케줄러의 내용을 출력하거나 편집할 수 있는 도구

crontab -l (스케줄 리스트)

crontab -e (스케줄 편집)

crontab -r (스케줄 전체 삭제)


ls -alhtr

a : 히든파일, 디렉터리 검색

l : 리스트 출력

h : 파일 용량 단위

t : 시간 순서

r : 역순 정렬

watch : default 2sec

watch -n 시간(초) "명령 옵션"

load average : 서버에 걸리는 부하

stress -c 2 -t 30

명령어 연속 실행

- 파이프라인 ( | )

: 파이프라인 왼쪽의 명령결과 표준스트림을 오른쪽 명령의 입력으로 사용

ssh root@10.0.10.100 "df -h | grep sda1"

- 세미콜론 ( ; )

: 세미콜론 왼쪽의 명령이 끝난 후 이어서 세미콜론 오른쪽의 명령을 실행

- AND 조건 ( && )

: AND 연산의 '하나라도 거짓이 있으면 전체 결과가 거짓'이라는 특성을 이용, AND 좌측 명령/테스트의 결과가 참이면 우측의 명령을 실행 (우측이 참인지 판단해야 하기 때문), AND 좌측 명령/테스트의 결과가 거짓이면 우측의 명령을 실행하지 않음 (이미 거짓이므로)

test 1 == 1 && ehco "이 문장은 조건이 참 일 경우 보입니다."

test 2 == 1 && ehco "이 문장은 조건이 참 일 경우 보입니다."

[ 1 == 1 ]

- OR 조건 ( || )

: OR 연산의 '하나라도 참이 있으면 전체 결과가 참'이라는 특성을 이용, OR 좌측 명령/테스트의 결과가 참이면 우측의 명령을 실행하지 않음 (이미 참이므로), OR 좌측 명령/테스트의 결과가 거짓이면 우측의 명령을 실행 (우측이 참인지 판단해야 하기 때문)

Q1) 다음 내용을 한 줄로 실행

- 현재위치에서 tmp디렉토리를 생성

- tmp디렉토리 안에 tmp.txt.파일을 생성

- tmp.txt 파일에 tmp라는 내용을 입력

- tmp.txt 파일의 내용을 화면에 출력

mkdir tmp;touch tmp/tmp.txt'ehco "tmp" > tmp/tmp.txt;cat tmp/tmp.txt

Q2) cent3서버의 프로세스 리스트에서 nfs 프로세스를 확인

ssh cent3

ps -ef / ps aux / ps axfwwwww

2번 결과 | grep nfs

ssh cent3 "ps -ef|grep nfs"

Q3) Q2에서 nfs 프로세스의 개수를 확인 (grep 제외)

ssh cent3 "ps -ef|grep -c  nfs"

ssh cent3 "ps -ef|grep nfs|wc -l"

ssh cent3 "ps -ef|grep nfs|grep -v grep|wc -l"

ssh cent3 "ps -ef|grep nfs|grep -cv grep"

ssh cent3 "ps -ef|pgrep nfs"

ssh cent3 "ps -ef|pgrep -l nfs"

ssh cent3 "ps -ef|pgrep -c nfs"

Q4) /var/log 디렉토리 하위에서 messages로그가 있는 지 확인하고 있으면 messages 로그의 하위 15라인을 출력

test문의 조건

-e : 파일이 존재하는가

-f : 지정한 파일이 파일이면 참 그 외엔 거짓

-d : 지정한 파일이 디렉토리면 참 그 외엔 거짓

/var/log/messages 파일이 있는 지 확인 (-e)

1번이 참이면 messages로그의 마지막 15줄을 화면에 출력한다

파일없으면 아무것도 안함

[ -e /var/log/messages ] && tail -n 15 /var/log/messages

Q5) mount의 결과를 보기 편하게 정렬

mount | column -t

Q6) ss의 결과를 보기 편하게 정렬

ss | cat


nano

: 리눅스 터미널 환경에서 직관적인 사용자 인터페이스를 제공하는 편집도구

ctrl + G 도움말

ctrl + O 저장

ctrl + Y 이전페이지

ctrl + V 다음페이지

ctrl + K 잘라내기

ctrl + U 잘라내기 취소

ctrl + W 찾기

ctrl + X 나가기

vim (vi improved)

: 리눅스 터미널 환경에서 사용자 인터페이스를 제공하는 편집도구, vi의 업그레이드 버전, neovim 이라는 이름으로 vim의 refactor버전이 나옴

- 일반모드

: 이동키로 커서를 이동하거나 편집할 수 있는 모드, 각 모드로 이동하기 전의 기본모드

이동키 : h(왼쪽) j(아래) k(위) l(오른쪽)

- 입력모드

편집키 : a(현재 커서 위치의 다음부터), i(현재 위치부터 입력), o(밑 줄로 이동후 입력)

- 비주얼모드

: 일반모드에서 v, V, ctrl+v를 누른 후 범위를 지정할 수 있는 모드, 지정한 범위의 복사(y)/잘라내기(x)/삭제(d)/붙여넣기(p)가 가능

^ <-- control key (ctrl)

- ex모드

: 일반모드에서 ':', '/'를 입력하여 vim편집기 하단에서 명령 또는 검색을 할 수 있는 모드

저장과 종료

':' 입력 후 w (저장), q (종료), wq (저장 후 종료), w! (강제저장), q! (강제종료)

bash 명령어 실행

':' 입력 후 '!명령어'로 bash 명령어 실행 가능

set number ( set nu )

검색

'/' 입력 후 현재 열고있는 문서에서 찾고자 하는 문자열을 입력

n을 눌러 다음 결과로 넘어감

emacs .....


#!/bin/bash

#!/usr/bin/env python

#!/usr/bin/env perl

#!/usr/bin/env bash

명령어 패스

echo ${PATH}

쉘 스크립트

- 조건문 / 반복문

- 함수 / 배열

- 리다이렉션의 활용

- 대화식 구성 / 메뉴 구성

- 조건문

- if [ 조건문1 ] ; then

조건문1이 참일 경 실행할 명령어

elif [ 조건문2]; then <-- 조건이 필요한 경우 추가 가능

조건문1은 거짓이고 조건문2가 참일 경우 실행할 명령어

else

조건문1,2가 모두 거짓일 경우 실행할 명령어

fi

- 비교표

A -ea B : A와 B가 같은가

A -ge B : A가 B보다 크거나 같은가

A -gt B : A가 B보다 큰가

A -le B : A가 B보다 작거나 같은가

A -lt B : A가 B보다 작은가

A -ne B : A와 B가 같지 않은가

A = B : 문자 A, B가 같은가

A != B : 문자 A, B가 다른가

A < B : 문자열 A가 B보다 작은가 (바이트)

A < B : 문자열 A가 B보다 큰가 (바이트)

-n A : A의 문자열 길이가 -보다 큰가

-z A : A의 문자열의 길이가 0인가

d file : 파일이 존재하고 디렉토리인가

-e file : 파일이 존재하는가

-f file : 파일이 존재하고 파일인가

-r file : 파일이 존재하고 읽을 수 있는가

-s file : 파일이 존재하고 비어있지 않은가

-w file : 파일이 존재하고 쓰기가 가능한가

- 조건문

- case 변수 in

패턴1)

패턴1이 참일 경우 실행할 명령어;;

패턴2)

패턴2가 참일 경우 실행할 명령어;;

... <-- 패턴이 더 필요한 경우 추가

*)

위에서 지정한 모든 패턴에 해당이 안되는 경우 실행할 명령어;;

esac

- 반복문

- for 변수 in 변수에 넣을 데이터

do

데이터가 끝날 때까지 반복해서 실행할 명령어

done

- while 조건문

do

조건이 참인 동안 반복해서 실행할 명령어

done

- 함수

- function 함수명 {

명령어

}

>> grep function *.sh

함수이름 () {

명령어

}

- 배열

- 배열에 숫자 또는 문자 사용 가능

test_array=(one two three 4 5 6 7)

echo ${test_array[*]}

for i in $(seq 0 7);do echo ${test_array[${i}]};done

- 리다이렉션

- 입력/출력/에러(표준 스트림)를 지정한 곳으로 바꿔준다

- 쉘 스크립트 안에서 텍스트 파일의 활용

while { ...} < server_list

ls -al txt1 txt2 txt3 txt4

ls -al txt1 txt2 txt3 txt4 1> ok 2> ng

tee (>&cat)

tee -a (>>&cat)

- 대화식 쉘 스크립트

- 쉘 스크립트 실행 후 사용자에게 입력을 받은 숫자/문자를 처리

- 정해진 숫자 맞추기 게임

read -p

- 메뉴가 있는 쉘 스크립트

- dialog --옵션명 옵션에필요한변수

calendar 날짜를 선택하는 달력을 표시

checklist 여러 항목의 선택이 가능한 체크박스를 표시

radiolist 한 가지 항목만 선택이 가능한 라디오버튼을 효시

fselect 파일을 선택하는 창을 표시

passwordbox 입력받는 텍스트를 숨기는 입력 창을 표시

gauge 진행 비율을 나타내는 진행 바를 표시

infobox 메세지를 표시

menu 선택할 수 있는 목록을 표시

msgbox 메세지를 표시하고 ok버튼을 쵸시

yesno 메세지를 표시하고 yes, no 버튼을 표시


- CUT

: 간결한 문법으로 파일에서 문자열 필드를 뽑아내는 명령

- SED

: 텍스트 입력 스트림을 받아 출력을 제어할 수 있는 명령

옵션

-e 입력을 처리하는 하나의 처리 명령을 의미, 여러번 지정하여 여러번의 처리가 가능

-f file 사전에 명령을 추가한 파일을 지정하여 명령을 수행

-n 각 명령의 결과를 화면에 출력하지 않고 print 명령을 대기

-r 확장된 정규표현식을 사용

문자열 처리 명령어

명령어     //     이름      //     내용

[텍스트라인 -범위]/p //  print // 출력

[텍스트라인 -범위]/d // delete // 삭제

s/소스패턴/결과패턴/ // substitute // 한 줄에서 처음 나타나는 소스패턴을 결과패턴으로 치환

[텍스트라인 -범위]s/소스패턴/결과패턴/ // subsitute // 지정한 범위에서 처음 나타나는 소스패턴을 결과패턴으로 치환

[텍스트라인 -범위]y/소스패턴/결과패턴/ // transform // 지정한 범위에서 소스패턴을 결과패턴으로 바꿈 (문자 수가 같아야함)

명령어처리_스크립트/g // global // 명령어처리 스크립트의 모든 소스패턴을 결과패턴으로 변경

echo "이것은 테스트 문장입니다." | sed 's/테스트/test/'

sed 's/테스트/sed test/' data.txt

sed '3,5s/테스트/sed test/' data.txt

sed '3,5d' data.txt

sed 's/테스트/sed test/w data2.txt' data.txt

sed -e 's/테스트/test/; s/문장/문자열/' data.txt

sed -n 's/테스트/test/' data.txt

sed -n 's/테스트/test/p' data.txt

sed -n '/검색어/p' 파일명

# cat two.sed

s/테스트/sed test/

s/문장/문자열/

sed -f two.sed data.txt

- AWK

: sed기능 + 변수 /함수 /연산자를 사용하여 필요한 데이터를 제어할 수 있는 프로그래밍이 가능한 명령

- 정규표현식

- 텍스트의 패턴을 특수문자 등을 사용하여 표현한 것

메타문자 // 의미 // 매칭 가능한 문자열

A* // A다음에 0개 이상의 문자를 매칭 // A Aa Abc A13cg ...

A? // A다음에 1개의 문자를 매칭 // Aa Ab Ac A1 Az ...

^A // A로 시작하는 문자열 // Abcde Avoid Attack ...

A$ // A로 끝나는 문자열 // A bA cdgdA abcdefA ...

A|B // A 또는  B가 있음을 의미 // c[A|B]f : cAf cBf

[a-z] // a부터 z까지 알파벳의 범위를 매칭 // a b c d e ...

ls -1 a*

find . -type f -iname "t*"

find . -iname "txt?"

find . -iname "t[x|z]t"

ls -al txt[0-9]

ls -al txt[0-9][0-9]

sed -n '/^3/p' data.txt

sed -n '/c$/p' txt1

- awk

- awk 옵션 읽어들일_파일명

-F 필드구분자 // 필드를 구분하기 위한 구분자를 지정

-f 파일이름 // awk프로그램이 읽어들일 파일 이름을 지정

-변수 =변수값 // awk프로그램에서 사용할 변수를 지정

awk '{print $1} txt13

awk '{print $1} txt13 | grep ccc

awk '/ccc/ {print $1} txt13

grep 111 txt13 | awk '{print $3}'

awl '/111/ {print $3}' txt13

awk -F: '{print $1}' colon_txt13

awk '{print $1}' /etc/passwd

awk -F: '{print $1}' /etc/passwd

uptime | awk '{print $10, $11, $12}'

uptime | awk -Faverage: '{print $2}'

df | awk -f df_chk.awk | grep \/


- 트러블 슈팅이란?

발생한 트러블(문제)를 슈팅(해결)하는 것

- 웹서버에서 자주 일어나는 장애 유형

- 디스크 풀

로그를 기록하는 프로세스가 에러 또는 멈춘다

임시 파일을 생성해야 하는 명령어의 실행이 안도니다

리눅스는 루트 유저만을 위한 예약 블록을 남겨두어 트러블슈팅이 가능하도록 설계

- 메모리 풀

- 메모리를 다 쓰고 스왑 영역까지 사용하여 시스템이 느려져 유저에게 응답이 느려짐

- 시스템 부하

- 로드 에버리지가 cpu코어 개수보다 높은 경우 유저 요청에 대한 응답이 늦어짐

- 프로그램의 문제

- 프로그램 오동작

du -h --max-depth=1

du -h --max-depth=1 2>/dev/null

du -sh * | grep G

ls -alh | grep G

) 로그 파일 크기 감시

watch -n 5 'ls -alh | grep log_name'

watch -n 3 'ls -al /var/log/nginx | grep VWS.access.log'

) 디스크 사용량 감시

watch -n 5 'df -h'

df, du ,crontab, awk 응용

df -h | awk '{print $1, $2, $3, $4, $5, $6}' | column -t

df -h | awk '{gsub("%", "$"); print $5}'

du -m /var/log/nginx | awk '{print $1}'

df -h | awk '{print $5}' | awk -F% '{print $1}' | grep -v "^[A-Z]"

df -h | awk '{gsub("%",""); print $5, $6}' | column -t

df -h | awk '{gsub("%",""); USE=$5; MNT=$6; print USE, MNT}' | column -t

df -h | awk '{gsub("%",""); USE=$5; MNT=$6; if ( USE > 80 ) print USE, MNT}' | column -t

df -h | awk '{gsub("%",""); USE=$5; MNT=$6; if ( USE > 80 ) print USE, MNT}' | column -t | grep -v "^[A-Z]"

df -h | awk '{gsub("%",""); USE=$5; MNT=$6; if ( USE > 80 ) print MNT,"파티션이 ",USE,"%를 사용 중입니다."}' | grep -v "^[A-Z]"

crontab

분 시간 일 월 요일 실행할프로그램 // 0,7일 1월 2화 3수 4목 5금 6토

crontab -e, -l, -r(삭제 옵션 이므로 사용 주의)

# 로그 디렉토리 감시 스크립트

00 * * * * /root/tmp/monitor/log_min.sh >/dev/null 2>&1

# 디스크 파티션 감시 스크립트

30 * * * * /root/tmp/monitor/part_mon.sh >/dev/null 2>&1

- 백업

tar

-p : 퍼미션 유지

-P : 절대경로 유지

mariabackup

- 무엇을

웹 : 웹소스, 서버 주요 설정 >> tar볼로 묶어서 보관

데이터베이스 : 데이터, 서버 주요 설정 >> db 덤프는 maria 전용 백업 툴 mariabackup을 사용

스토리지 : 서버 주요 설정 >> 스토리지는 데이터 용량이 크기 때문에 향후 스토리지 이중화 등을 통해 데이터 안전성을 확보

- 언제

하루 한 번 트래픽이 가장 적은 시간 대 >> 새벽 3시 ~ 5시

- 어디에

스토리지의 BACKUP 디렉토리 (각 서버 이름(hostname) 디렉토리) >> /mnt/BACKUP/서버의호스트이름

ls -al web_backup.sh | awk '{print $5}'

ls -al web_backup.sh | awk '{print $9}'

ls -1 web_backup.sh

scp -rp web_backup.sh storage_backup.sh

# 웹서버 백업

00 04 * * * /root/tmp/BACKUP/web_backup.sh >/dev/null 2>&1

# 스토리지(nfs)서버 백업

00 04 * * * /root/tmp/BACKUP/storage_backup.sh >/dev/null 2>&1

# DB서버 백업

00 04 * * * /root/tmp/BACKUP/db_backup.sh >/dev/null 2>&1

- 제한적인 쉘 스크립트 작성에 대해

- set -exuo pipefail

e : errexit, 첫번째 실행 실패(exit코드가 0이 아닌 상태로 종료하는 명령어)시 쉘 스크립트 종료

x : xtrace, 매 라인을 실행하기 전에 필요한 산술확장, 매개변수확장, 명령치환, 변수대입 등을 화면에 출력

u : nounset, 정의가 안 된 변수를 사용하면 에러 메세지를 출력하고 쉘 프로그램 강제 종료

o : 옵션을 on/off 할 수 있다

set -o [옵션명] : 옵션 on

set +o [옵션명] : 옵션 off

pipefail : 옵션명, 파이프로 연결된 명령이 전부 true일 때만 true를 반환하도록 함

- 장애 원인 찾기

- 웹서버

df로 용량 확인

로그 용량 확인

du로 디렉토리별 용량 확인

백업 파일을 로컬에 저장중 --> 문제

- 왜 스토리지가 아닌 로컬에 백업 파일을 저장했나?

백업 쉘 스크립트 확인

스토리지 마운트 부분 오타로 마운트 실패

- 같은 쉘 스크립트를 복사해서 사용했기 때문에 데이터베이스 서버의 원인도 같은 것으로 여겨짐

데이터베이스 서버에 접속해서 확인

- 장애 원인 파악

set -exuo pipefail

백업 디스크 감시 스크립트 : 하루에 한번, 백업이 끝난 이후에

# DB서버 백업

00 05 * * * /root/tmp/monitor/mnt_mon.sh >/dev/null 2>&1

find  ./ -name test

stat 111

touch -t 2012121000 111

find ./ -mtime -10

find ./ -mtime +3 -exec rm {} \;


1. 명령어 옵션을 활용한 팁

1-1. 보기쉽게 명령 결과를 정렬

- column

mount(ls -al ...) |column -t

ls -al |column -t

df -h |column -t

1-2. 메모리 많이 사용하는 프로세스 top 10

- ps aux |sort -nr -k 4 |head -10

1-3. 특정 시간이 지나면 명령어를 자동 종료

timeout Ns COMMAND

2. 문법을 활용한 팁

2-1. 현재 위치 하위의 디렉토리별 파일 수 카운트

- find . -xdev -type d -exec /bin/echo -n "{} : " \; -exec sh -c "ls {} | wc -l" \;

-xdev >> 로컬에 있는 파일시스템만 검색

2-2. 어떤 프로세스가 io interrupt를 기다리고 있는지 확인

- while true; do date; ps auxf |awk '{if($8=="D") print $0;}'; sleep 1; done

2-3. 특정한 프로그램(프로세스명)이 전체 메모리의 몇 퍼센트를 사용하는지 확인

- ps -eo pmem,comm |grep -i "PROCESS_NAME" |awk '{sum+=$1} END {print sum "% os MEMORY"}'