[Linux] (shell) 스크립트 기초

 

l  Linux

 

스크립트(shell script) 셸이나 명령줄 인터프리터(Interpreter)에서 실행되도록 작성되었거나 운영 체제를 위해 쓰인 스크립트이다. 스크립트가 수행하는 일반 기능으로는 파일 이용, 프로그램 실행, 문자열 출력 등이 있다. 스크립트에서는 .sh라는 파일 확장자를 가진 파일이 특정 종류의 스크립트를 가리키는 것이 보통이지만, 대부분의 스크립트는 파일 확장자를 지니지 않는다. 스크립트는 인터프리터 방식이므로 라인별로 읽어 실행함으로 속도가 다소 느리다는 단점이 있다.

스크립트라는 말은 유닉스 쉘을 위해 쓰인 스크립트를 말하는 반면, command.com(도스) cmd.exe (윈도우) 명령 스크립트는 보통 배치 파일이라고 불린다.  최근엔 마이크로소프트가 개발한 CLI쉘인 파워쉘이 있다.

 

이번 포스트에서는 가장 널리 쓰이는 bash 쉘을 사용하는 스크립트를 설명한다.

 

문장의 시작 (#!/bin/bash)

스크립트의 번째줄에는 항상 #!/bin/bash 기입되어 있어야 한다. 내용은 쉘이 실행될 어떤 쉘로 스크립트를 실행할지 정의하는 곳이다. 쉘에는 다양한 버전이 있다. 아래 예시는 hello.sh 라는 스크립트를 생성하고 실행하는 방법을 설명한다. 아래 스크립트를 hello.sh라는 파일을 생성하고 입력한다.

#!/bin/bash
 
echo "Hello, Shell Script"

 

아래 명령을 사용하여 스크립트를 실행하면 Hello, Shell Script 출력한다. 스크립트 명령어에 대한 부분은 아래에서 자세히 설명하도록 한다. 만약 실행이 되지 않는다면 실행 권한이 없어 발생한것으로 chmod 777 hello.sh 실행하여 권한 변경 실행한다.

$sh hello.sh

 

 

 

주석 처리 (#)

스크립트에서 단일 주석은 (#) 사용한다.

#!/bin/bash
 
#여기는 주석입니다.
#주석은 실행되지 않습니다.
 
echo "Hello, Shell Script"

 

블록 주석은 : <<”END” ~ ~ END 사용한다.

#!/bin/bash
 
: << “END” #주석 시작
여기는 주석입니다.
주석은 실행되지 않습니다.
END #주석
 
echo "Hello, Shell Script"
 

 

 

입력(read), 출력(echo)

echo 출력, read 입력을 있다. 위에서 이미 echo 사용하였으므로 read 사용하여 입력한 값을 출력하도록 스크립트를 작성해 본다. 입력 받은 값을 변수로 사용하려면 $기호를 사용한다.

#!/bin/bash
read input_value
echo "Hello, $input_value!"

 

스크립트를 실행하면 입력값이 발생할 때까지 실행되지 않고 대기한다. hahaha라고 입력하면 입력 받은 값이 변수로 사용되어 결과가 출력된다.

$sh hello.sh
hahaha

 

 

 

변수 특징

l  변수의 타입에는 로컬변수와 전역변수, 환경변수, 예약변수, 매개변수 다양하다.

l  변수는 , 소문자를 구별한다.

l  변수명에는 영문자, 숫자, 언더바( _ ) 사용된다.

l  변수의 이름은 숫자를 포함할 있지만, 숫자로 시작할 없다.

l  변수에는 모든 값을 문자열로 저장된다.

l  변수에는 자료형을 기입하지 않기 때문에 어떠한 값도 입력할 있다. (변수에 타입을 지정할 수도 있다.)

l  값을 사용할 때는 변수명 앞에 특수문자 "$" 사용한다. (Ex. echo ${data})

l  값을 대입(삽입) 때는 특수문자 "$" 사용하지 않는다. (Ex. data=mac)

l  변수를 생성할 때는 "=" 대입문자 앞뒤로 공백이 없어야 한다. (Ex. data="abcd") 문자열인 경우 “ “ 감싼다.

l  하나의 변수에 개의 값만 보존된다.

l  변수 값이 덮어 쓰기되는 것을 방지하기 위해서는 readonly 사용한다.

l  변수를 unset으로 삭제할 있다. (readonly 선언된 것은 삭제가 불가능하다.)

 

스크립트에서 시스템이 사용하는 예약어가 있다. 가지 대표적인 예약어이다.

변수 설명
HOME 사용자 디렉토리 의미
PATH 실행 파일의 경로
LANG 프로그램 실행 지원되는 언어
UID 사용자의 UID
SHELL 사용자가 로그인시 실행되는
USER 사용자 계정 이름
FUNCNAME 현재 실행되고 있는 함수 이름
TERM 로그인 터미널
Set 변수를 출력하는 명령어
Env 환경 변수를 출력하는 명령어
Export 특정 변수의 범위를 환경 변수의 데이터 공간으로 전송하여 자식 프로세스에서도 특정 변수를 사용 가능하게 한다.
unset 선언된 변수를 제거

 

 

전역변수, 지역변수

쉘에서 선언된 변수는 기본적으로 전역변수(global variable)이며, 함수안에서 지역변수(local variable) 사용할 있는데, 이때에는 local 붙여서 사용한다. 함수안에서 local 사용하지 않으면 전역 변수의 값을 덮어쓰게 된다.

#!/bin/bash
 
# 전역 변수 지정
string="hello shell, global variable"
 
function string_test() {
    # local 붙여야 지역변수로 인식. 만약 local 빼면 전역변수에 덮어쓰기로 적용
    local string="hello shell, local variable"
    echo ${string}
}
 
# 함수 호출
string_test # > hello shell, local variable
echo ${string} # > hello shell, global variabl
 
# 변수 초기화
unset string

 

 

 

변수 타입 지정

기본적으로 Bash 문자열만 저장하지만 데이터 타입을 지정할 수도 있다.

변수타입 설명
declare -r 읽기 전용 타입
declare -i 정수형 타입
declare -a 배열 타입
declare -A 연관배열(MAP) 타입
declare -f 함수 타입
declare -x 환경변수(export) 지정으로 외부 환경에서도 변수를 사용할 있다.

 

 

읽기전용 변수 (readonly)

변수에 값을 덮어 쓸수 있지만 readonly 지정한 경우 변수를 덮어쓸수 없다. 아래 예시는 readonly에서 변수 덮어쓰기를 시도할 발생한 오류를 확인할 있다.

#!/bin/bash
 
var="변수1"
VaR_2="변수2"
echo "Var_2=$VaR_2"
 
VaR_2="VaR_2 변경합니다."
echo ${VaR_2}
 
readonly var
var="readonly var 변수를 변경해 봅니다."

 

 

 

변수 값의 치환

변수의 값을 치환할 사용하는 문법을 표로 정리하였다.

문법 설명
${var} 변수 값을 바꿔 넣는다.
${var:-word} 변수가 아직 세팅되지 않거나 공백 문자열의 경우 word 반환한다. var에는 저장되지 않는다.
${var:=word} 변수가 아직 세팅되지 않거나 공백 문자열의 word 반환한다. var 저장된다.
${var:?word} 변수가 아직 세팅되지 않거나 공백 문자열의 경우 치환에 실패하고, 스탠다드 에러에 에러가 표시된다.
${var:+word} 변수가 세팅되지 않은 경우 word 반환된다. var에는 저장되지 않는다.

 

#!/bin/sh
 
echo "1 - ${var:-wordSetInEcho1}"
echo "2 - var = ${var}"
echo "3 - ${var:=wordSetInEcho3}"
echo "4 - var = ${var}"
unset var
echo "5 - ${var:+wordSetInEcho5}"
echo "6 - var = $var"
var="newVarValue"
echo "7 - ${var:+wordSetInEcho7}"
echo "8 - var = $var"
echo "9 - ${var:?StandardErrorMessage}"
echo "10 - var = ${var}"

 

 

문자열 패턴 비교는 아래 조건을 사용할 있다.

문법 설명
${var%pattern} 끝에서 부터 word 패턴이 일치하는 var 최소 부분(첫번째 일치) 제거하고 나머지를 반환
${var%%pattern} 끝에서 부터 word 패턴이 일치하는 var 최대 부분(마지막 일치) 제거하고 나머지를 반환
${var#pattern} 처음 부터 word 패턴이 일치하는 var 최소 부분( 번째 일치) 제거하고 나머지 부분을 반환
${var##pattern} 처음 부터 word 패턴이 일치하는 var 최대 부분(마지막 일치) 제거하고 나머지 부분을 반환

 

 

환경 변수 (export)

스크립트에서 변수명 앞에 export 붙여 환경변수(environment variable) 사용할 있다. 다만 환경변수 사용시 시스템에 미리 정의된 예약변수와 겹치지 않게 주의한다. 실습을 위해 개의 파일을 준비한다.

shell1.sh
#!/bin/bash
 
echo ${export_variable}

 

shell2.sh
#!/bin/bash
 
#환경변수 선언
export export_variable="export test, hello shell"
 
#변수값을 받아서 사용할 스크립트 호출
/파일 경로/shell1.sh

 

shell2.sh 실행한다. Export 변수의 값은 shell1.sh 호출할 사용된다.

 

 

매개변수

프로그램에서 실행할 인자를 사용하듯 스크립트에서도 매개변수를 사용할 있다. 규칙이 있는데, 실행한 스크립트 이름은 ${0}, 이후 인자 값들은 ${1}. ${2}…으로 사용한다.

변수 기능
$0 스크립트명
$1 ~ $9 인수 1 번째부터 인수 9번째까지 사용
$# 스크립트에 전달될 인수의
$* 모든 인수를 모아 하나로 처리
$@ 모든 인수를 각각 처리
$? 직전에 실행한 커멘드의 종료 (0 성공, 1 실패)
$$ 스크립트의 프로세스ID
$! 마지막으로 실행한 백그라운드 프로세스 ID

 

아래 스크립트는 매개변수를 입력 받아 어떻게 사용되는지 알아보는 예시이다.

#!/bin/sh
 
echo "\$0script name: $0"
echo "\$11st param: $1"
echo "\$22nd param: $2"
echo "\$#number of param: $#"
echo "\"\$*\": \"$*\""
echo "\"\$@\": \"$@\""
VAR="exit code is  0 "
echo $?

 

실행 결과는 아래와 같이 나타난다.

 

 

배열 (Array)

스크립트에서 배열은 1차원 배열만 지원하며 중괄호를 사용해야 한다. 배열 원소는 소괄호안에 공백으로 구분하며, 배열 원소는 문자열이든 숫자형이던 상관없이 있다.

#!/bin/bash
 
arr=("hello" "shell" 1 2 3 4 5)
 
echo "배열 전체 : ${arr[@]}"
echo "배열 원소의 갯수 : ${#arr[@]}"
echo "배열 첫번째 : ${arr}, 혹은 ${arr[0]}"
echo "4 index 갖는 배열의 원소 : ${arr[4]}"
 
arr[5]="four"
 
echo "4번째 index 갖는 배열의 원소 : ${arr[4]}"
 
# 4번째 해제
unset arr[4]
echo "4 배열 삭제 완료"
echo "4 index 갖는 배열의 원소 : ${arr[4]}"
echo "5 index 갖는 배열의 원소 : ${arr[5]}"

 

 

 

함수(function)

스크립트에서도 함수를 사용할 있다. 함수의 정의 형식은 아래와 같다. 주의할 점은 함수가 호출되기 전에 함수가 정의되어 있어야 하며 호출할 때는 괄호를 사용하지 않고 호출한다.

#!/bin/bash
 
function func(){
        echo "func()"
}
 
#함수 호출
func

 

 

비교문(if..fi)

쉘에서는 비교문이 약간 특이하다. bash if문의 특이한 점은 fi 대괄호([ ]) 이다. 다른 언어와 달리 중괄호를 사용하지 않기 때문에 fi if문의 끝을 알려주어야 한다. 주의해야 점은 if 뒤에 나오는 대괄호 [ ] 조건식 사이에는 반드시 공백이 존재해야 한다.

 

비교문에는 다양한 연산자를 사용할 있다.

연산자 설명
1 -eq 2 # 값이 같음(equal)
1 -ne 2 # 값이 같지 않음(not equal)
1 -lt 2 # 1 2보다 작음(less than)
1 -le 2 # 1 2보다 작거나 같음(less or equal)
1 -gt 2 # 1 2보다 (greater than)
1 -ge 2 # 1 2보다 크거나 같음(greater or equal)

 

문자열 비교

연산자 설명
문자1 = 문자2 # 문자1 문자2 일치 (sql같이 = 하나만 써도 일치로 인식)
문자1 == 문자2 # 문자1 문자2 일치
문자1 != 문자2 # 문자1 문자2 일치하지 않음
-z 문자 # 문자가 null 이면
-n 문자 # 문자가 null 아니면
문자 == 패턴 # 문자열이 패턴과 일치
문자 != 패턴 # 문자열이 패턴과 일치하지 않음

 

논리 연산자

연산자 설명
조건1 -a 조건2 # AND
조건1 -o 조건2 # OR
조건1 && 조건2 # 양쪽 성립
조건1 || 조건2 # 한쪽 또는 양쪽다 성립
!조건 # 조건이 성립하지 않음
true # 조건이 언제나 성립
false # 조건이 언제나 성립하지 않음

 

산술연산자 (쉘에서는 expr 숫자 연산자 숫자형식으로 사용한다.)

연산자 의미 예시
+ 덧셈 echo `expr 10 + 20` => 30
- 뺄셈 echo `expr 20 - 10` => 10
\* 제곱 echo `expr 11 \* 11` => 121
/ 나눗셈 echo `expr 10 / 2` => 5
% 나머지 echo `expr 10 % 4` => 2
= 저장 a=$b b 값은 a 저장
== 동일 [ "$a" == "$b" ] $a $b 동일하는 경우 TRUE 반환
!= 다름 [ "$a" != "$b" ] $a $b 동일하지 않는 경우 TRUE 반환

 

 

예제로 살펴본다.

#!/bin/bash
 
function func(){
        a=10
        b=5
 
        if [ ${a} -eq ${b} ]; then
                echo "a b 같다."
        fi
 
        if [ ${a} -ne ${b} ]; then
                echo "a b 같지 않다."
        fi
 
        if [ ${a} -gt ${b} ]; then
                echo "a b보다 크다."
        fi
 
        if [ ${a} -ge ${b} ]; then
                echo "a b보다 크거나 같다."
        fi
 
        if [ ${a} -lt ${b} ]; then
                echo "a b보다 작다."
        fi
 
        if [ ${a} -le ${b} ]; then
                echo "a b보다 작거나 같다."
        fi
 
}
 
#함수 호출
func

 

 

 

여러 조건을 사용할때, 다른 언어에서는 else if역할을 하는 것을 스크립트에서는 elif라는 것을 사용하여 else if 동일한 역할을 있다. elif[ 조건 ]; then 형식으로 사용한다. 만약 반복문에서 사용하여 조건이 참일때 반복문을 멈추고 싶을때 break라는 키워드를 사용하여 반복문을 멈출 있다.

#!/bin/bash
 
case ${1} in
        "linux") echo "리눅스" ;;
        "unix") echo "유닉스" ;;
        "windows") echo "윈도우즈" ;;
        "MacOS") echo "OS" ;;
        *) echo "해당없음" ;;
esac

 

 

파일 관련 조건문

스크립트는 명령어를 다루는 스크립트이기 때문에 파일이 존재하는지, 디렉토리가 존재하는지 파일과 관련된 조건 여부도 조건문을 통해 있다. 아래 표는 조건을 정리한 것이다. , 거짓을 판단할 , 느낌표(!) 사용하면 반대로 결과를 출력한다.

조건 설명
if [ -d ${변수} ]; then ${변수} 디렉토리가 존재하면 true.
if [ ! -d ${변수} ]; then ${변수} 디렉토리가 존재하지 않으면 true.
if [ -e ${변수} ]; then ${변수}라는 파일이 존재하면 true.
if [ ! -e ${변수} ]; then ${변수}라는 파일이 존재하지 않으면 true.
if [ -L ${변수} ]; then 파일이 symbolic link이면 true.
if [ -s ${변수} ]; then 파일의 크기가 0보다 크면 true.
if [ -S ${변수} ]; then 파일 타입이 소켓이면 true.
if [ -r ${변수} ]; then 파일을 읽을 있으면 true.
if [ -w ${변수} ]; then 파일을 있으면 true.
if [ -x ${변수} ]; then 파일을 실행할 있으면 true.
if [ -f ${변수} ]; then 파일이 정규 파일이면 true.
if [ -c ${변수} ]; then 파일이 문자 장치이면 true.
if [ ${변수1} -nt ${변수2}]; then 변수1 파일이 변수2 파일보다 최신 파일이면 true.
if [ ${변수1} -ot ${변수2}]; then 변수1 파일이 변수2 파일보다 최신이 아니면 true.
if [ ${변수1} -ef ${변수2}]; then 변수1 파일과 변수2 파일이 동일하면 true.

 

 

CASE

일반적인 CASE 사용법과 비슷하지만 CASE 끝에 세미콜론을 2개씩 사용하는 특징이 있다. 그리고 CASE 끝은 ESAC 닫아준다.

#!/bin/bash
 
DRINK="coffee"
case "$DRINK" in
    "beer") echo "맥주입니다"
    ;;
    "juice") echo "주스입니다"
    ;;
    "coffee") echo "개발자에겐 카페인 필수!"
    ;;
esac

 

 

CASE에서 OR 연산도 가능하다.

COUNTRY=korea
 
case $COUNTRY in
  "korea"|"japan"|"china") # or 연산도 가능하다
    echo "$COUNTRY is Asia"
    ;;
  "USA"|"Canada"|"Mexico")
    echo "$COUNTRY is Ameria"
    ;;
  * )
    echo "I don't know where is $COUNTRY"
    ;;
esac

 

 

반복문(for)

반복문을 빠져나갈때에는 break 사용하고, 현재 반복분이나 조건을 건너뛸때에는 continue 사용한다.

#!/bin/bash
 
# 초기값; 조건값; 증가값을 사용한 정통적인 for
for ((i=1; i<=4; i++)); do
    echo $i
done

 

 

 

반복문(for in)

#!/bin/bash
 
function func(){
        echo "사용예1"
        for i in 1 2 3 4 5
        do
                echo "${i}"
        done
 
        echo "사용예2"
        list="1 2 3 4 5"
        for i in ${list}
        do
                echo "${i}"
        done
 
        echo "사용예3"
        for i in {1..5}
        do
                echo "${i}"
        done
 
        echo "사용예4: 크기를 2만큼 증가시키면서 출력"
        for i in {1..5..2}
        do
                echo "${i}"
        done
 
        echo "사용예5: 배열을 이용"
        arr=(1 2 3 4 5)
        for i in "${arr[@]}"
        do
                echo "${i}"
        done
 
 
        echo "사용예6: C 유사한 형식의 for"
        for ((i=0; i<5; i++)); do
                echo "${i}"
        done
}
 
#함수 호출
func

 

 

 

반복문 (while)

수행 조건이 true일때 실행되는 반복문이다.

count=0
while [ ${count} -le 5 ];
do
    echo ${count}
    count=$(( ${count}+1 ))
done

 

 

이중 괄호를 사용하면 논리 기호로도 사용 가능하다.

count=0
while (( ${count} <= 5 ));  # 이중괄호 사용하면 논리기호 사용 가능
do
    echo ${count}
    count=$(( ${count}+1 ))
done

 

 

반복문(until)

수행 조건이 false 일때 실행되는 반복문이다. 조건이 While 반대라고 생각하면 된다.

count2=10
 
until [ ${count2} -le 5 ]; do
    echo ${count2}
    count2=$(( ${count2}-1 ))
done

 

 

 

종료 상태 코드

명령어가 실패할 경우 리턴되는 결과에 따라 다른 동작을 하려면 명령어의 종료 코드를 반환 받아 사용하면 된다. 명령어의 종료 코드는 $? 사용하여 가장 최근 실행한 명령어의 종료 코드를 받을 있다. 정상적인 종료는 0 반환되며 0 아닌 값은 오류라고 판단할 있다. 아래 표는 종료 코드에 따른 설명을 정리한 것이다.

종료 코드 설명
0 성공 (Success)
1 일반적 오류 (Catchall for general errors)
2 내장 명령의 틀린 사용 (Misuse of shell builtins)
126 파일이 실행 가능하지 않음 (Command invoked cannot execute)
127 명령어를 찾을 없음 (Command not found)
128 종료할 잘못된 인수 적용 (Invalid argument to exit)
128+n 치명적인 시그널 n 에러 (Fatal error signal “n”)
130 [Ctrl + C] 조합에 의한 종료 (Script terminated by Control-C)

 

 

이스케이프 문자

명령어 설명
\f 문자열만큼 열을 밀어서 이동한다.
\n 새로운 줄로 바꾼다.
\r 문자열의 앞부분 부터 뒷문자열 만큼 대체하고 반환한다.
\t 만큼 띄운다.

 

 

외에도 다양한 명령이 있다. 명령을 활용하면 리눅스 환경에서 시스템 관련 다양한 정보들을 스크립트로 얻을 있다.

 

 

 

[참고자료]

l   https://ko.wikipedia.org/wiki/%EC%85%B8_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8

l   https://reakwon.tistory.com/136

l   https://inpa.tistory.com/entry/LINUX-%EC%89%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%95%B5%EC%8B%AC-%EB%AC%B8%EB%B2%95-%EC%B4%9D%EC%A0%95%EB%A6%AC

l   https://engineer-mole.tistory.com/200

 

 

 

2023-09-05 / Sungwook Kang / https://sungwookkang.com

 

 

리눅스, Linux, 쉘스크립트, 쉘사용법, 쉘명령어, shell command, shell script

'Linux' 카테고리의 다른 글

[Linux] Alpine Linux (알파인 리눅스) 는 무엇일까?  (0) 2023.09.04
[Linux] OOM(Out of Memory)란?  (0) 2023.08.30
CnetOS 방화벽 설정  (0) 2015.07.22
CentOS 파일 압축/풀기  (0) 2015.07.22
CentOS 심볼 링크 설정  (0) 2015.07.22

[Linux] Alpine Linux (알파인 리눅스) 무엇일까?

 

l  Linux

 

컨테이너 환경으로 다양한 서비스를 빌드하다보니, DevOps 팀에서 베이스 이미지를 ubuntu centos 대신 alpine(알파인) 리눅스를 사용하는 것이 어떻겠냐는 제안을 받았다. 리눅스는 다양한 커널 기반으로 배포판을 가지고 있다. 이번 포스트에서는 Alpine Linux (이하 알파인 리눅스”) 대해서 알아본다.

 

[개요]

알파인 리눅스는 리눅스 커널 기반으로 리눅스 배포판 하나이며 MIT 라이선스 아래에 배포되었으며 LEAF 리눅스의 포크 버전이다. 알파인 리눅스는 다른 배포판과 다르게 Musl BusyBox 기반으로 한다. 알파인 리눅스의 컨셉은 LEAF 리눅스와 동일하게 작고”, “보안이 뛰어나고”, “간단함 기반으로 한다. 하지만 시간이 지나면서 다양한 사람들에 의해 알파인 리눅스만의 형태로 발전되고 있다.

 

[특징]

장점

l  가볍고, 간단하며 보안성을 목적으로 개발한 배포판

l  용량을 줄이기 위해 시스템의 기본 C runtime glibc 대신 musl libc 사용

l  다양한 명령어는 GNU util대신 busybox 탑재

l  초경량( 80MB) 배포판으로 임베디드나 네트워크 서버 특정 용도에 적합.

l  특히 도커(Docker) 공식 이미지로 채택되어 5MB 크기의 리눅스 이미지로 유명함

l  보안에 염두해두고 설계되어 모든 바이너리는 독립적인 실행 파일(PIE) 컴파일

 

단점

l   리눅스 표준인 GNU 도구가 없어가나 Busybox 대신 들어가 있어, 명령어를 실행할 주의가 필요

l   라이트한 대신 패키지가 설치되어 있지 않아 직접 설치해주어야 하는 것들이 많다.

l   이것저것 설치하다보면 표준 리눅스 배포판과 거의 비슷한 용량이 되기도 한다. (개인적인 생각)

 

 

BusyBox?
BusyBox 일종의 명령어 모음집으로 박스안에 필요한 응용 프로그램들을 담아 놓은 것이다. 리눅스에서 사용되는 명령어들만 모아 놓아도 상당한 크기를 차지할 있는데, BusyBox에서는 각각에 함수들을 최소 사이즈로 다시 구현하였다. 그렇기 때문에 Embbeded(임베디드), 네트웍 서버 특정 용도에 적합하며 도커 컨테이너의 OS 많이 사용한다.

 

 

[자주 사용되는 명령어]

알파인 리눅스에서는 패키지 인스톨러가, 전통적인 yum, apt 대신에 apk 사용한다. 그리고 기본 쉘이 배시가 아니라 애쉬(ash)이다.

 

명령 설명
apk update 패키지 저장소 목록을 업데이트
apk search <package> 패키지 저장소 목록에서 패키지를 검색. v 옵션으로 설명 확인 가능.
apk add <package[=version]> 패키지를 설치. 버전을 명시하여 설치 가능.
apk del <package> 특정 패키지를 제거
apk cache clean 패키지 캐시를 모두 제거
apk cache -v sync 패키지 캐시를 초기화하고 부족한 패키지를 자동으로 다운로드
apk stats 현재 패키지 저장소에서 사용가능한 패키지나 설치된 패키지 등의 정보를 출력
apk fix 복구가 필요한 패키지를 복구하거나 종속성을 제외하고 업그레이드 진행.
apk info 현재 설치된 모든 패키지 정보 나열. -L 옵션을 사용하면 패키지내 파일 정보 출력.

 

 

[ 컨테이너에서 알파인 리눅스를 사용할까?]

지극히 개인적인 생각이다. 컨테이너 이미지 파일을 만들 , 베이스 이미지 위에 필요한 다양한 패키지를 설치하게 된다. 당연히 베이스 이미지 + 기타 필요한 패키지 크기만큼 이미지 사이즈가 되므로 빌드 용량도 커지게 된다. 그리고 이를 보관 배포하기 위해 스토리지 비용 네트워크 비용이 증가할 있다. 사실 스토리지 비용은 컴퓨팅 비용중에 가장 저렴한 부분 하나이다. 그래서 요즘은 용량 고민은 많이 하지 않는 편이다. 특히 온프레미스 환경에서 직접적으로 모든 것을 운용할 때에는 더더욱 그렇다. 하지만 클라우드 환경에선, 모든것이 비용으로 청구되기 때문에 최소한의 사이즈로 운영하면 비용 최적화에 많은 도움이 있을 것이라 생각한다.

 

 

 

[참고자료]

l   Alpine Linux:Overview : https://wiki.alpinelinux.org/wiki/Alpine_Linux:Overview

l   Alpine Linux  : https://namu.wiki/w/Alpine%20Linux

 

 

 

2023-09-04 / Sungwook Kang / https://sungwookkang.com

 

 

리눅스, Linux, 알파인 리눅스, Apline Linux, APK 명령어, 리눅스 배포판

'Linux' 카테고리의 다른 글

[Linux] 쉘(shell) 스크립트 기초  (0) 2023.09.05
[Linux] OOM(Out of Memory)란?  (0) 2023.08.30
CnetOS 방화벽 설정  (0) 2015.07.22
CentOS 파일 압축/풀기  (0) 2015.07.22
CentOS 심볼 링크 설정  (0) 2015.07.22

[Linux] OOM(Out of Memory)?

 

l  Linux

 

몇일전부터 개발 환경에서 겪던 문제로 멀쩡하던 MySQL 서비스가 갑자기 연결이 되지 않는다. 처음엔 단순히 현상인줄 알고, MySQL 서비스를 재시작 하였다. 그런데 동일한 상황이 하루에도 여러 발생하고 있어서 원인을 살펴보기로 했다. 원인을 살펴보니, 아래와 같은 로그가 있었다.

Aug 30 01:35:08 xxxxx kernel: [7189052.423131] [18540]   111 18540  1930392  1535479 12935168        0             0 mysqld
Aug 30 01:35:08 xxxxx kernel: [7189052.423132] Out of memory: Kill process 18540 (mysqld) score 512 or sacrifice child
Aug 30 01:35:08 xxxxx kernel: [7189052.424065] Killed process 18540 (mysqld) total-vm:7721568kB, anon-rss:6141916kB, file-rss:0kB, shmem-rss:0kB
Aug 30 01:35:08 xxxxx kernel: [7189052.749286] oom_reaper: reaped process 18540 (mysqld), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

 

OOM으로 인한 OOM Killer(강제 서비스 종료)였다. OOM 무엇이고 발생하는 것일까? 그리고 로그는 어떻게 확인할 있을까?

 

OOM (Out of Memory)

Linux swap 메모리와 물리 메모리를 모두 사용 , 프로세스에서는 필요에 의해 추가적인 물리 메모리 할당을 요청하였는데, 이상 할당할 물리 메모리 공간이 없어 할당이 불가능한 상태를 의미한다. 메모리 Over Commit 상태일 발생하는 현상으로 물리적으로 메모리가 부족하다는 뜻이다. 이러한 문제는 물리 메모리만 증설하면 사실 간단히 해결된다. 하지만 이러한 현상이 발생하는지 원인을 찾지 못한 상태에서 무한정 메모리를 증설할 수도 없다.

 

OOM Killer

서버 메모리 부족으로 OOM 발생하였을 , 리눅스에서는 메모리를 확보하기 위해 OOM Score 기준으로 점수가 높은 프로세스를 강제로 Kill 하여 메모리를 확보하는 Kernel 기능이다. 이렇게 OOM Killer 프로세스가 종료되면 내부 시스템 로그에 기록되어 추후 확인할 있다.

 

OOM Killer Log 확인

OOM Killer 프로세스가 종료되었을 때에는 각종 시스템 로그에서 확인할 있다. 시스템 로그에는 OOM Killer외에도 다양한 로그가 있기 때문에 로그 양이 많을 경우 필터를 해서 검색을 해야 수도 있다. 일반적으로 특별히 로그 경로를 수정하지 않았다면 아래 경로에서 다양한 시스템 로그를 확인할 있다.

 /var/log/

 

Kern.log에서는 아래와 같은 OOM 로그를 확인할 있었다.

cat kern.log

 

Aug 30 01:35:08 XXXXX kernel: [7189052.423131] [18540]   111 18540  1930392  1535479 12935168        0             0 mysqld
Aug 30 01:35:08 XXXXX kernel: [7189052.423132] Out of memory: Kill process 18540 (mysqld) score 512 or sacrifice child
Aug 30 01:35:08 XXXXX kernel: [7189052.424065] Killed process 18540 (mysqld) total-vm:7721568kB, anon-rss:6141916kB, file-rss:0kB, shmem-rss:0kB
Aug 30 01:35:08 xxxxx kernel: [7189052.749286] oom_reaper: reaped process 18540 (mysqld), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

 

syslog에서는 다양한 로그가 많이 기록되어 OOM이라는 필터를 사용하여 확인하였다.

cat syslog | grep oom

 

Aug 29 23:45:33 xxxxx kernel: [7182478.018455]  oom_kill_process+0x21f/0x420
Aug 29 23:45:33 xxxxx kernel: [7182478.018529] [ pid ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name
Aug 29 23:45:34 xxxxx kernel: [7182478.495925] oom_reaper: reaped process 22648 (mysqld), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
Aug 30 01:35:08 xxxxx kernel: [7189052.422998] icinga2 invoked oom-killer: gfp_mask=0x14200ca(GFP_HIGHUSER_MOVABLE), nodemask=(null), order=0, oom_score_adj=0
Aug 30 01:35:08 xxxxx kernel: [7189052.423021]  oom_kill_process+0x21f/0x420
Aug 30 01:35:08 xxxxx kernel: [7189052.423096] [ pid ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name
Aug 30 01:35:08 xxxxx kernel: [7189052.749286] oom_reaper: reaped process 18540 (mysqld), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

 

message 로그 파일에서도 동일한 오류 내역을 확인할 있다. Message 로그 파일은 다양한 로그 파일의 미러 역할을 하기 때문에 정말 다양한 로그가 기록되어 있다.

 

 

OOM killer 우선순위

로그를 살펴보면 OOM 의해 mysqld kill 되었음을 확인할 있다. 그렇다면 프로세스를 종료시키는 우선순위는 어떻게 정해질까? 가지 방법이 있다.

1.          oom_badness() 메소드에서 프로세스별 점수를 계산하여 종료시킬 프로세스를 선택한다.

2.          사용자가 특별히 지정하여 순위를 변동시킬 있다.

 

oom_badness() 사용하는 우선순위 선정 방법은 아래와 같다.

1.          특정 프로세스를 함으로써 최소한의 프로세스만 잃을 있어야 한다.

2.          많은 메모리를 회수할 있는 프로세스 (메모리 사용량이 작으면 되지 않는다.)

3.          프로세스중 Leak 발생하지 않는 프로세스 (릭이 발생하면 프로세스 Kill 의미가 없다)

4.          사용자가 특별히 지정한 프로세스

 

외에도 nice score 기반으로 우선순위를 선정할 있다.

 

 

OOM Killer score 확인

OOM score 확인 방법은 /proc/${pid}/oom_score 파일을 통해 조회할 있다. PID 확인하는 방법은 ps 명령을 사용한다.

l  ps : shell에서 실행중인 프로세스만 출력

l  ps -e : 실행 중인 모든 프로세스 출력

l  ps -f : 실행중인 모든 프로세스의 상태 정보 출력

l  ps -ef | grep mysql : grep 사용하여 특정 프로세스(mysql) PID 확인 한다.

 

ps -e | grep mywql

 

 

cat /proc/15368/oom_score

 

 

 

OOM Killer 순위 설정 방법

1.          특정 프로세스의 PID 조회

2.          /proc/PID/oom_adj 파일에 -17 입력. oom_adj -17 ~ 15 값을 가지며, 낮은 일수록 후순위.

3.          /proc_PID/oom_scroe_adj 파일에 -1000 입력. oom_score_adj -1000 ~ 1000 값을 가지며 낮은 값일수록 후순위.

 

아래 예시는 oom_adj 파일에 -17 변경하는 것으로 PID 변경하여 사용할 있다.

sudo echo -17 > /proc/${pid}/oom_ajd

 

아래 예시는 oom_score_adj파일에 -1000 변경하는 것으로 PID 변경하여 사용할 있다.

sudo echo -1000 > /proc/${pid}/oom_score_adj

 

 

메모리 누수로 인한 System hang 현상을 방지하기 위해 리눅서 커널에서는 OOM killer 자체는 비활성화 없기 때문에 순위 설정을 참고하여 중요한 프로세스는 Kill 되지 않도록 한다.

 

 

 

 

2023-08-30 / Sungwook Kang / https://sungwookkang.com

 

 

리눅스, Linux, OOM, OutOfMemory, 메모리부족현상, 강제킬, 프로세스확인, 메모리압박, 아웃오브메모리, OOMKiller, oom_score

'Linux' 카테고리의 다른 글

[Linux] 쉘(shell) 스크립트 기초  (0) 2023.09.05
[Linux] Alpine Linux (알파인 리눅스) 는 무엇일까?  (0) 2023.09.04
CnetOS 방화벽 설정  (0) 2015.07.22
CentOS 파일 압축/풀기  (0) 2015.07.22
CentOS 심볼 링크 설정  (0) 2015.07.22

CnetOS 방화벽 설정 

-       CentOS 6.4 

   

CentOS에서 방화벽 설정 하는 방법을 알아보자. 

   

터미널 모드를 실행하여 setup 명령어를 실행 한다. 

# setup 

   

 

   

   

텍스트 모드 설정 유틸리티가 나타나면 [방화벽 설정]을 선택 한다. 

 

   

   

방화벽 설정에서 스페이스바를 이용하여 체크를 하면 방화벽이 활성화 되며 체크를 하지 않으면 방화벽이 비활성화 된다. 

 

   

   

방화벽 활성화 여부를 선택하고 OK를 선택하면 기존 방화벽을 덮어쓰겠냐는 경고문이 나타난다. [예]를 선택하면 새로운 방화벽 정책이 적용되며 [아니오]를 선택하면 방화벽 설정 메뉴로 돌아간다. 

 

   

다른 방법으로 모든 방화벽을 제거하기 위한 명령어는 다음과 같다. 

# iptables -F 

   

방화벽 설정 확인은 다음 명령어를 사용 한다. 

# iptables -L 

   

 

   

   

   

강성욱 / http://sqlmvp.kr 

'Linux' 카테고리의 다른 글

[Linux] Alpine Linux (알파인 리눅스) 는 무엇일까?  (0) 2023.09.04
[Linux] OOM(Out of Memory)란?  (0) 2023.08.30
CentOS 파일 압축/풀기  (0) 2015.07.22
CentOS 심볼 링크 설정  (0) 2015.07.22
CentOS IP 확인 및 변경  (0) 2015.07.22

CentOS 파일 압축/풀기 

-       CentOS 6.4 

   

대부분 파일을 내려 받으면 압축이 되어 있을 것이다. 또는 어떤 파일을 전달 할 때 파일의 개수가 많을 때는 용량을 줄이기 위해 압축을 하는 경우도 있지만 하나의 파일로 패킹을 하기 위해 압축을 사용하기도 한다. 

   

압축 종류에 따라 압축을 하는 방법과 해제하는 방법을 알아보자. 

   

다음 예제는 아파치 사이트에서 하둡을 다운로드 하였을 때 압축 파일이다.  

 

   

터미널 모드에서 압축을 풀어 보도록 하자.  

# tar zxvf hadoop-1.2.1.tar.gz 

   

 

   

압축이 해제 된 것을 확인 할 수 있다. 

 

   

리눅스 장비에서 파일을 압축하거나 푸는 방법은 다양하다. 압축 방식에 따른 장/단점 및 사용법에 대해서 알아보자. 

   

[ZIP] 

가장 일반적으로 사용되는 압축 확장자 이다.  

l  장점 : 거의 모든 OS 환경에서 호환 된다. 

l  단점 : 최고 레벨의 압축을 지원하지 않는다. (tar.gz나 tar.bz2보다 압축 레벨이 낮다.) 

압축 

해제 

# zip –r FILENAME.zip FILENAME 

# unzip FILENAME 

   

l  'r' 옵션을 사용하여 하위 폴더까지 모두 압축  

   

   

[TAR] 

리눅스 환경에서 가장 일반적으로 사용된다. 

l  장점 : 압축에 소비되는 시간, CPU 사용량이 적다. 

l  단점 : 압축이 거의 되지 않는다. 주로 여러 파일을 하나의 파일로 묶는 용도로 사용한다. 

압축 

해제 

# tar –cf FILENAME.tar FILENAME 

# tar –xf FILENAME.tar 

  

지정된 위치에 풀기 

  

# tar –xvf FILENAME.tar –C /tmp/path/ 

  

   

   

[TAR.GZ] 

리눅스 환경에서 사용하기 가장 좋은 압축 옵션 중 하나 이다. 

l  장점 : 압축률은 높은 편이지만 CPU는 많이 소비되지 않는다. 

l  단점 : 최고 레벨의 압축을 지원하지 않는다. 

압축 

해제 

# tar –zcvf FILENAME.tar.gz FILENAME 

# tar –zxvf FILENAME.tar.gz 

  

지정된 위치에 풀기 

  

# tar –zxvf FILENAME.tar.gz –C /tmp/path/ 

   

l  'v'옵션으로 압축풀기 실행 과정 출력 

   

   

[TAR.BZ2] 

리눅스 환경에서 사용하기 가장 적합한 압축 옵션 중 하나 

장점 : 최고의 압축률 

단점 : 시간 및 CPU 사용률 높음 

압축 

해제 

# tar –jcvf FILENAME.tar.bz2 FILENAME 

# tar –jxvf FILENAME.tar.gz2 

  

지정된 위치에 풀기 

  

# tar –jxvf FILENAME.tar.bz2 –C /tmp/path 

   

   

   

[참고자료] 

http://kthan.tistory.com/152 

   

   

강성욱 / http://sqlmvp.kr 

'Linux' 카테고리의 다른 글

[Linux] OOM(Out of Memory)란?  (0) 2023.08.30
CnetOS 방화벽 설정  (0) 2015.07.22
CentOS 심볼 링크 설정  (0) 2015.07.22
CentOS IP 확인 및 변경  (0) 2015.07.22
CentOS 호스트명 (HostName) 변경  (0) 2015.07.22

CentOS 심볼 링크 설정 

-       CentOS 5.1 

   

   

l  심볼릭 링크 만들기 : ln [옵션] [파일명] [링크명] 

예를 들어 java라는 폴더가 루트에 있을 때 java에 대한 심볼을 만들어 보자. 

[root@cent4 ~]# ln –s jdk1.7.0_45 java 

   

ln에 대한 옵션은 man ln 을 실행하면 도움말을 볼 수 있다. 

 

   

l  -b : 대상 파일이 이미 있으면 그것을 백업 한다. 

l  -d : 경로의 하드링크를 허용한다. 시스템 관리자만 가능 

l  -f : 대상 파일이 이미 있어도 그냥 지운다 

l  -i : 대상 파일이 이미 있을 때 어떻게 할 것인지 사용자에게 물어본다. 

l  -n : 만약 링크할 파일이 심볼릭 파일이면 ln 명령은 그 심볼릭 대상이 되는 파일을 링크한다. 

l  -s : 심볼릭 링크 생성 

l  -v : 각 파일의 작업 상태를 자세히 보여준다. 

l  -help : 도움말을 보여주고 마친다. 

l  -version : 버전 정보를 보여주고 마친다. 

l  -S : 만약에 대상이 이미 있어 백업을 해야할 경우에 그 백업 파일에서 사용할 파일 이름의 꼬리문자를 지정한다. 

l  -V : 백업하는 방법을 지정.  

   

   

강성욱 / http://sqlmvp.kr 

'Linux' 카테고리의 다른 글

CnetOS 방화벽 설정  (0) 2015.07.22
CentOS 파일 압축/풀기  (0) 2015.07.22
CentOS IP 확인 및 변경  (0) 2015.07.22
CentOS 호스트명 (HostName) 변경  (0) 2015.07.22
리눅스 기본 – 터미널 사용, 명령어 정리  (0) 2015.07.22

CentOS IP 확인 및 변경 

-       CentOS 5.1 

   

[IP 확인] 

현재 설정되어 있는 IP 확인 명령은 ifconfig 이다. 

 

   

   

[IP 변경] 

다음 명령을 실행 한다. 

/etc/sysconfig/network-scripts/ifcfg-eth0 

   

 

   

자동 할당 으로 설정되어 있다면 고정으로 바꾸고 IP를 부여 한다. 

 

   

l  BOOTPROTO=static ##ip할당 방식 (static : 고정 IP, dhcp : 동적 IP) 

l  HWADDR=xx:xx:xx:xx:xx:xx ## 맥주소  

l  BROADCAST= ## 브로드캐스트 주소  

l  IPADDR= ##아이피주소  

l  NETMASK= ##넷마스크 주소  

l  NETWORK= ##네트워크 주소  

l  GATEWAY= ## 게이트웨이 주소  

l  ONBOOT=yes ## 부팅시 자동 활성 여부 yes , no  

l  PEERDNS=yes ## dhcp 서버의 dns정보를 resolv.conf에 저장여부 yes or no  

l  DNS1= ## DNS주소  

l  DNS2= ##DNS주소  

l  USERCTL=no ## 일반 계정이 컨트롤 가능 yes no  

l  NM_CONTROLLED=yes ## 네트워크 관리도구 사용 미사용 yes no 

   

IP를 변경하였으며 저장 후 반드시 네트워크 재시작 또는 시스템 재시작을 해야 한다. 

네트워크 재시작은 다음 명령어를 사용할 수 있다. 

/etc/init.d/network restart 

   

   

GUI 모드에서 변경이 가능하다. [시스템] – [관리] – [네트워크]를 선택 한다. 

 

   

   

[네트워크 설정]에서 해당 장치를 선택하고 더블 클릭 또는 편집을 선택 한다. 

 

   

   

이더넷 장치에서 IP를 입력하고 저장한다.  

 

   

네트워크 또는 서비스를 재시작 한다. 

   

   

   

강성욱 / http://sqlmvp.kr

'Linux' 카테고리의 다른 글

CnetOS 방화벽 설정  (0) 2015.07.22
CentOS 파일 압축/풀기  (0) 2015.07.22
CentOS 심볼 링크 설정  (0) 2015.07.22
CentOS 호스트명 (HostName) 변경  (0) 2015.07.22
리눅스 기본 – 터미널 사용, 명령어 정리  (0) 2015.07.22

CentOS 호스트명 (HostName) 변경 

-       CentOS 5.1 

   

시스템의 호스트명을 변경하여 보자. 터미널에서 명령어를 통한 변경 방법과 설정 파일에서 수정하여 적용하는 방법을 알아보자. 변경된 호스트명이 적용되려면 반드시 시스템을 재시작 해야 한다. 

   

현재 호스트명을 검사하는 명령어로는 hostname 를 입력한다. 현재 호스트의 이름은 Cent4이다. 

hostname 

   

 

   

   

[vi 명령어로 호스트명 변경] 

vi명령어를 사용할 때에는 대소문자에 주의한다. 

vi /etc/sysconfig/network 

   

 

   

vi 명령어로 network 파일의 내용을 읽어서 수정한다. 이때 키보드의 [INSERT] 키를 사용하여 에디터의 내용을 삽입하거나 수정 할 수 있다.(하단의 빨간 박스 부분에 따라 삽입 또는 수정) 

기존의 Cent4의 호스트명을 Cent5로 수정하였다. 

 

   

   

수정내용을 저장하고 나가기 위해서는 [ESC]키를 누른다. 그리고 [:wq]를 입력하면 하단에 해당 명령어가 입력되는 것을 확인 할 수 있다. 엔터를 눌러 실행 한다. 

 

   

   

vi모드를 빠져나게 되면 reboot 명령을 사용하여 재부팅 한다. 

 

   

   

호스트명이 변경된 것을 확인 할 수 있다. 

 

   

   

[설정 파일에서 직접 변경] 

[파일시스템 – [etc] – [sysconfig] – [network 파일] 

 

   

파일에서 호스트명을 변경하고 저장한다음 시스템을 재실행 한다. 

 

   

 
강성욱 / http://sqlmvp.kr

'Linux' 카테고리의 다른 글

CnetOS 방화벽 설정  (0) 2015.07.22
CentOS 파일 압축/풀기  (0) 2015.07.22
CentOS 심볼 링크 설정  (0) 2015.07.22
CentOS IP 확인 및 변경  (0) 2015.07.22
리눅스 기본 – 터미널 사용, 명령어 정리  (0) 2015.07.22

리눅스 기본 – 터미널 사용, 명령어 정리 

-       CentOS 5.1 

   

리눅스와 윈도우는 같은 개념이라도 용어를 다르게 사용하는 경우가 있다. 가장 대표적인 것이 폴더와 디렉토리 이다. 

Windows 

Linux 

폴더(flolder) 

디렉토리(directory) 

   

리눅스도 윈도우처럼 GUI환경을 제공하지만 아직도 많은 작업은 터미널 에디터를 사용한다. 터미널 에디터 실행과 그 안에 나타나는 정보를 살펴 보자. 

   

터미널 실행은 다음과 같이 UI에서 [프로그램] –[보조 프로그램] –[터미널]을 선택 한다. 

 

[터미널]을 선택하면 다음과 같이 에디터 창이 나타나고 명령어를 실행 할 수 있다.  

 

l  root : 로그인한 사용자 계정명 

l  @Cent4 : 시스템의 호스트명 

l  # : 관리자 계정 ($ : 사용자 계정) 

   

   

터미널의 경우는 매우 자주 사용되기 때문에 윈도우의 단축 아이콘처럼 바탕화면에 생성하도록 하자. [터미널]에서 마우스 오른쪽을 클릭하여 [실행 아이콘을 바탕화면에 더하기]를 선택 한다. 

 

   

다음과 같이 바탕화면에 [터미널] 아이콘이 생성된 것을 확인 할 수 있다. 

 

   

   

터미널에서는 명령어를 실행할 수 있다. 다음의 pwd 명령은 현재의 절대경로를 확인하는 명령어 이다. 

pwd 

   

 

   

[CentOS 명령어] 

명령어 

경로 

사용유형 

설명 

.bash_history 

각 계정의 홈 디렉터리 

편집 

사용자가 적었던 명령어 기록 

.bash_logout 

각 계정의 홈 디렉터리 

편집 

로그아웃시 실행되는 배치파일 

.bash_profile 

각 계정의 홈 디렉터리 

편집 

로그인시 실행될 항목 

.bashrc 

각 계정의 홈 디렉터리 

편집 

단축키 설정 

.vimrc 

각 계정의 홈 디렉터리 

생성->편집 

vi편집기 설정 

at 

   

   

예약작업 

at.allow 

/etc 

편집 

특정 계정 at 허용 

at.deny 

/etc 

편집 

특정 계정 at 거부 

atd 

/etc/init.d 

   

at 데몬 

atq 

   

   

예약 작업 보기 

atrm 

   

   

예약 작업 지우기 

bc 

   

   

계산기 

cal 

   

   

달력 

cat 

   

   

파일 생성, 내용 보기 

cd 

   

   

디렉터리 이동 

chage 

   

   

계정, 암호 만료일자 설정 

chattr 

   

   

속성 변경 

chgrp 

   

   

파일의 그룹 변경 

chkconfig 

   

   

데몬 설정 

chmod 

   

   

파일의 퍼미션 변경 

chown 

   

   

파일의 사용자, 그룹 변경 

clear 

   

   

화면 청소 

clock 

   

   

시각, 날짜 보기. 

cp 

   

   

복사 

cron.allow 

/etc 

편집 

특정 계정 cron 허용 

cron.deny 

/etc 

편집 

특정 계정 cron 거부 

crond 

/etc/init.d 

   

예약작업 데몬 

crontab 

   

편집, 실행 

예약작업 

date 

   

   

날짜, 시각 보기 

df 

   

   

전체 용량 보기 

dhcpd 

/sbin 

   

dhcp데몬(tar.gz의 경우) 

dhcpd.conf 

/etc 

편집 

dhcp설정 파일 

dhcpd.leases 

/var/db 

생성->편집 

dhcp로그 파일(tar.gz의 경우) 

dhcpd.leases 

/var/lib/dhcp 

편집 

dhcp로그 파일(rpm의 경우) 

du 

   

   

디렉터리별 용량 보기 

exit 

   

   

로그아웃 

fdisk 

   

   

파티션 설정 

fg 

   

   

포그라운드로 불러내기 

find 

   

   

찾기 

free 

   

   

메모리 사용량 확인 

fsck.ext3 

   

   

수동 시스템 검사(꼭 싱글모드에서 해야함) 

fstab 

/etc 

편집 

마운트 설정 

ftp 

   

   

파일 서버 

gcc 

   

   

컴파일 

grep 

   

   

내용 찾기 

group 

/etc 

편집 

그룹 확인 

groupadd 

   

   

그룹 생성 

groupdel 

   

   

그룹 삭제 

groupmod 

   

   

그룹 수정 

groups 

   

   

유저가 속한 그룹 보기 

grub.conf 

/boot/grub 

편집 

부팅 설정 

gzip 

   

   

압축 

halt 

   

   

컴 수동 종료 

head 

   

   

파일내용 앞부분 출력 

history 

   

   

사용 명령어 목록 출력 

hosts.allow 

/etc 

편집 

호스트 허용 

hosts.deny 

/etc 

편집 

호스트 차단 

httpd 

/etc/init.d 

   

웹서버 데몬 

id 

   

   

계정 정보 보기 

ifcfg-eth0 

/etc/sysconfig/network-scripts 

편집 

eth0의 네트워크 설정 보기 

ifconfig 

   

   

ip보기, 설정 

init 

   

   

부팅 모드 실행 

inittab 

   

편집 

init 설정 

issue 

/etc 

편집 

로그인전 출력할 내용 

jobs 

   

   

작업 보기 

kill 

   

   

프로세스 종료 

last 

   

   

부팅 로그 보기 

lastlog 

   

   

마지막 접속로그 보기 

ln 

   

   

링크하기 

login.defs 

/etc 

편집 

계정 번호 설정 

logout 

   

   

로그아웃 

ls 

   

   

파일의 목록 보기 

lsattr 

   

   

속성 보기 

man 

   

   

매뉴얼 보기 

mc 

   

   

탐색기 

messages 

/var/log 

편집 

로그인 로그 파일 

mkdir 

   

   

디렉터리 생성 

motd 

/etc 

생성->편집 

로그인후 출력할 내용 

mount 

   

   

장치 연결하기 

mv 

   

   

이동, 이름 변경 

network 

/etc/init.d 

   

네트워크 데몬 

ntsysv 

   

   

데몬 사용, 사용안함 

passwd 

/etc 

편집 

계정 목록 

passwd 

   

   

암호 설정 

patch 

   

   

패치하기 

ping 

   

   

핑 보내기 

profile 

/etc 

편집 

로그인시 실행될 항목 

proftpd 

   

   

pro ftp 데몬 

ps aux 

   

   

프로세스 보기 

pwconv 

   

   

쉐도우 패스워드 설정 

pwunconv 

   

   

쉐도우 패스워드 해제 

python 

   

   

파이썬(프로그래밍 언어) 실행 

reboot 

   

   

재부팅 

rm 

   

   

파일, 디렉터리 삭제 

rmdir 

   

   

디렉터리 삭제 

rpm 

   

   

rpm 설치, 제거, 검색 

scp 

   

   

파일 주고받기 

service 

   

   

데몬을 시작시키거나 중지시킨다 

setup 

   

   

여러가지 시스템 설정 

shadow 

/etc 

편집 

계정 목록(컨버전 안된 암호가 표시됨) 

shutdown 

   

   

컴 끄기 

shutdown.allow 

/etc 

편집 

셧다운 명령을 허용할 유저목록 

squid 

/etc/init.d 

   

프록시 서버 데몬 

ssh 

   

   

암호화 지원하는 원격접속 프로그램 

su 

/etc/pam.d 

편집 

su 설정 

su 

   

   

사용자 변경 

tail 

   

   

파일내용 뒷부분 출력 

tar 

   

   

파일 묶기, 압축 

tee 

   

   

파일로 출력 

telnet 

/etc/xinetd.d 

편집 

텔넷 설정 

telnet 

   

   

원격접속 프로그램 

touch 

   

   

파일 생성 

tty 

   

   

터미널 번호 보기 

tune2fs 

   

   

자동 시스템 검사 

umount 

   

   

마운트 해제 

uname -r 

   

   

커널 버전 보기 

useradd 

   

   

계정 생성 

userdel 

   

   

계정 삭제 

usermod 

   

   

계정 수정 

vi 

   

   

편집기 

vim 

   

   

vi편집기 향상판 

vipw 

   

   

vi /etc/passwd 

   

   

시스템에 접속한 사용자 상황 표시 

wall 

   

   

메시지 보내기 

who am I 

   

   

자세한 자신의 정보 보기 

whoami 

   

   

자신의 정보 보기 

xinetd 

/etc/init.d 

   

수퍼 데몬 

Yum 

   

   

인터넷을 통한 rpm 설치 

[명령어 출처 : http://blog.naver.com/jktk1/100058585182

'Linux' 카테고리의 다른 글

CnetOS 방화벽 설정  (0) 2015.07.22
CentOS 파일 압축/풀기  (0) 2015.07.22
CentOS 심볼 링크 설정  (0) 2015.07.22
CentOS IP 확인 및 변경  (0) 2015.07.22
CentOS 호스트명 (HostName) 변경  (0) 2015.07.22

+ Recent posts