본문 바로가기
프로그래밍 놀이터/Script(Python)

[책 정리] 04. 더 많은 bash 쉘 명령 - 리눅스 커맨드라인 쉘 스크립트 바이블

by 돼지왕 왕돼지 2020. 4. 23.
반응형

프로그램 감시하기


* 프로세스 엿보기


-

ps 명령은 시스템에서 실행되는 모든 프로그램에 대한 많은 정보를 보여준다.

이 녀석은 어마어마하게 많은 옵션을 제공하므로 매우 복잡한 녀석이다.

기본 ps 명령은 수많은 정보들을 보여주지 않는다.

그리고 ps 명령은 현재 사용자에 속해 있으며 현재 터미널에서 실행시키고 있는 프로세스만을 보여준다.

이 경우 bash shell 은 물론 ps 명령도 표시된다.


기본 출력은 PID, TTY(실행된 터미널), 프로세스가 사용한 CPU 시간이다.



-

리눅스 시스템에서 사용되는 GNU 의 ps 명령은 세 가지 유형의 커맨드라인 옵션을 지원한다.

1. 대시가 붙는 유닉스 스타일 옵션

2. 대시가 붙지 않는 BSD 스타일 옵션

3. 이중 대시가 붙는 GNU 의 긴 옵션



** 유닉스 스타일 옵션


-

여러 옵션이 있지만 일반적으로 -ef 를 많이 사용한다.

-e 는 모든 프로세스 표시이며, -f 는 추가 정보를 포함한 전체 출력이다.


출력 중 설명이 필요한 부분은..

C : 프로세스의 수명 동안 프로세서 사용률

STIME : 프로세서가 시작되었을 때의 시스템 시각

TTY : 프로세스를 시작한 터미널 장치

TIME : 프로세스를 실행하기 위해 요구된 누적 CPU 시간

CMD : 시작된 프로그램의 이름



-

-l 옵션으로 더 많은 정보를 볼 수 있다. ( L 의 소문자형 )


F : 커널이 프로세스에 할당한 시스템 플래그 

S : 프로세스 상태 (O:프로세서에서 실행, S:휴면, R:실행 가능하며 실행 대기, Z:좀비, T:중지됨)

PRI : 프로세스의 우선 순위(높을수록 낮은 우선순위)

NI : 나이스 값, 우선순위를 결정하는데 이용됨

ADDR : 프로세스의 메모리 주소

SZ : 프로세스가 스왑 아웃될 때 필요한 스왑 공간의 대략적인 양

WCHAN : 프로세스가 휴면 상태가 될 때 커널 함수의 주소



** BSD 스타일의 매개변수


-

버클리 소프트웨어 배포판(BSD)은 유닉스 버전의 일종으로 캘리포니아 버클리대학교에서 개발되었다.

AT&T 유닉스 시스템과는 미묘한 차이가 많아 오랫동안 수많은 유닉스 전쟁을 촉발시켰다.


옵션은 마찬가지로 상당히 많으며 유닉스 스타일과 겹치는 게 많다.

편하게 느껴지는 스타일을 선택해서 사용하면 된다.



-

-l 에 비해 l 옵션은 또 다른 정보를 보여준다. ( L 의 소문자형 )

$ ps l 


VSZ : 메모리에 있는 프로세스의 크기(KB)

RSS : 스왑되지 않은 프로세스가 사용하는 물리적 메모리

STAT : 현재 프로세스의 상태를 나타내는, 두 개의 문자로 이루어진 상태 코드


많은 시스템 관리자가 BSD 스타일의 l 옵션을 좋아한다. 더욱 자세한 상태 코드(STAT)를 두 개의 문자로 보여주기 때문이다.

두개의 문자 중 첫번째 문자는 유닉스 스타일의 S 출력 열과 동일한 값을 쓰며 프로세스가 휴면 상태인지, 실행 상태인지, 대기 상태인지를 보여준다.

두번째 문자는 프로세스의 상태를 더욱 자세하게 정의한다.


< : 높은 우선순위로 실행되는 프로세스

N : 낮은 우선순위로 실행되는 프로세스

L : 메모리에 잠긴 페이지가 있는 프로세스

S : 세션 리더 프로세스

L : 멀티 스레드 프로세스

+ : 포그라운드에서 실행되는 프로세스



** GNU 형식의 긴 매개변수


-

두 유형의 옵션을 통합하면서 GNU 개발자는 몇 가지 더 많은 옵션을 추가하여 ps 명령을 더욱 새롭고 더욱 발전된 방향으로 손질했다.



* 실시간 프로세스 모니터링


-

ps 명령은 시스템에서 실행 중인 프로세스에 대한 정보를 수집하기에는 매우 좋지만 한 가지 단점이 있다.

특정 시점에 대한 정보만을 표시한다는 것이다.

메모리 스왑이 자주 일어나는 프로세스를 찾으려면 top 명령을 사용하는 것이 좋다.



-

top 의 결과 중 첫번째 부분은 총괄적인 시스템 정보를 보여준다.

평균 부하는 세 가지 수치, 1분, 5분, 15분 평균 부하로 표시된다.

수치가 높을수록 시스템은 더 많은 부하가 생긴다.

시스템마다 이 부하값은 달라질 수 있다. 어떤 시스템에서는 높지만, 어떤 시스템에서는 낮을 수 있다.

보통 평균 부하가 2를 넘는 수치로 시작하면 시스템이 무척 바쁘다는 뜻이다.



-

TOP 의 항목들은 다음과 같다. (ps 와 비슷)

PR : 프로세스 우선 순위

NI : 프로세스의 nice  rkqt

VIRT : 프로세스가 사용하는 가상 메모리 총량

RES : 프로세스가 사용하는 물리적 메모리 양

SHR : 다른 프로세스와 공유하는 메모리의 양

S : 프로세스 상태 (D:깨울 수 있는 휴면, R:실행, S:휴면, T:추적 또는 중지, Z:좀비)

%CPU : 프로세스가 사용하는 CPU 시간 비율

%MEM : 프로세스가 사용하는 사용 가능한 물리적 메모리의 비율

TIME+ : 프로세스가 시작될 때부터 사용한 총 CPU 시간

COMMAND : (프로그램이 실행될 때) 프로세스의 커맨드라인 이름



-

top 은 기본적으로 %CPU 값을 기준으로 프로세스를 정렬한다.

top 이 실행되는 동안 여러 가지 대화형 명령 가운데 하나를 써서 정렬 방법을 바꿀 수 있다.

예를 들어 f 를 누르면 출력을 정렬하는데 사용할 필드를 사용자가 선택할 수 있고, d 를 누르면 새로 고치는 간격을 바꿀 수 있다. q 를 누르면 종료한다.



* 프로세스를 중단시키기    


-

리눅스에서 프로세스는 신호로 서로 통신한다.

프로세스 신호는 프로세스가 인식할 수 있는 미리 정의된 메시지로 프로세스는 이를 무시하거나 처리할 수 있다.


1 : HUP : 연결 끊어짐

2 : INT : 인터럽트

3 : QUIT : 실행중지

9 : KILL : 강제 종료

11 : SEGV : 세그먼트 위반을 생성

15 : TERM : 가능하면 종료

17 : STOP : 무조건 중지하지만 종료되지는 않음

18 : TSTP : 중지하거나 일시 정지하지만 백그라운드에서 계속 실행

19 : CONT : STOP 또는 TSTP 후 실행 재개



** kill 명령


-

kill 명령은 pid 를 기반으로 프로세스에 신호를 보낸다.

kill 명령은 명령 행에 나열된 모든 pid 에 TERM 신호를 보낸다.

프로세스 신호를 보내려면 나 자신이 그 프로세스의 소유자이거나 루트 사용자로 로그인해야 한다.



-

TERM 신호는 프로세스에게 실행을 중지하라고 친절하게 알려준다.

폭주하는 프로세스는 이런 요청을 무시할 수 있다.

더 강력한 방법으로 -s 옵션을 통해 다른 신호를 지정할 수 있다.

$ kill -s HUP 3940



** killalll 명령


-

killall 명령은 PID 번호가 아닌 이름으로 프로세스를 중지시키는 강력한 방법이다.

killall 명령은 와일드카드 문자도 쓸 수 있다.

$ killall http*




디스크 공간 모니터링


* 미디어 마운트


-

리눅스 파일시스템은 하나의 가상 디렉토리에 모든 미디어 디스크를 결합한다.

시스템에 새로운 미디어 디스크를 사용하려면 먼저 이를 가상 디렉토리에 배치해야 한다. 

이 작업을 마운트라고 한다.



-

대부분 리눅스 배포판은 특정한 유형의 이동식 미디어를 자동으로 마운트할 수 있는 기능을 제공한다.

이동식 미디어는 CD-ROM 이나 USB 메모리 스틱처럼 손쉽게 PC 에 탈착할 수 있는 매체다.


이동식 미디어를 자동으로 마운트하고 언마운트하지 않는 배포판을 사용하고 있다면 이 작업을 직접 해야 한다.



** mount 명령


-

미디어를 마운트하는데 사용되는 명령은 mount 이다.

기본적으로 mount 명령은 현재 시스템에 마운트 된 미디어 장치의 목록을 표시한다.

여기서는 네 가지 정보를 제공한다.

1. 미디어의 장치 파일 이름

2. 미디어가 마운트 된 가상 디렉토리의 마운트 지점

3. 파일 시스템 유형

4. 마운트 된 미디어의 엑세스 상태



-

수동으로 가상 디렉토리에 미디어 장치를 마운트하려면 루트 사용자로 로그인하거나 루트 사용자로 명령을 실행할 수 있는 sudo 명령을 사용해야 한다.

$ mount -t [type] [device] [directory]

$ mount -t vfat /dev/sdb1 /media/disk


type 옵션은 디스크를 포맷할 때 사용한 파일시스템 유형을 정의한다.

다음과 같은 대표적 유형이 있다.

    vfat : 윈도우의 긴 파일시스템

    ntfs : 윈도우 NT, XP 및 VISTA 7, 10 에서 사용되는 윈도우 고급 파일시스템

    iso9600 : 표준 CD-ROM 파일시스템


대부분의 USB 메모리와 외장 하드는 vfat 파일시스템을 사용하여 포맷된다.



-

돼왕)

device 에는 아래와 같은 값들이 들어간다.

floppy disk : fd0, fd1, ...

scsi disk : sda, sdb, ... (disk 의 각각의 partition 은 sda1, sda2, ... )

scsi cd-rom : scd0 또는 sr0



-

미디어 장치가 가상 디렉토리에 장착된 후, 루트 사용자는 장치에 대한 완전한 액세스 권한이 있지만 다른 사용자의 엑세스는 제한된다.

디렉토리 권한으로 장치에 대한 액세스 권한이 있는 사용자를 제어할 수 있다.



-

-o 에 추가 옵션으로 자주 쓰이는 옵션은 다음과 같다.

RO : 읽기 전용으로 마운트

RW : 읽기-쓰기로 마운트

user : 일반 사용자가 파일시스템을 마운트 가능

check-none : 무결성 검사를 수행하지 않고 파일시스템을 마운트함

loop : 하나의 파일을 마운트함



** unmount 명령


-

리눅스는 마운트된 CD 를 꺼낼 수 없도록 한다.

언마운트 후 CD 를 꺼내야 한다.



-

$ unmount [directory | device]

$ unmount /home/rich/mnt

unmount 명령은 장치의 위치나 마운트된 디렉토리 이름 가운데 하나로 미디어 장치를 정의할 수 있다.

어떤 프로그램이든 장치에 있는 파일을 열어 놓은 상태라면 시스템은 그 장치의 언마운트를 허락하지 않는다.



* df 명령 사용하기.


-

디스크 공간 확인을 위해서는 df 명령을 사용하면 된다.

결과로 장치의 위치, 데이터를 저장할 수 있는 1024 바이트 블록의 양, 사용된 1024 바이트 블록의 양, 사용할 수 있는 1024 바이트 블록의 양, 사용된 공간의 백분율, 장치가 마운트 된 마운트 포인트 등이 표시된다.

-h 옵션을 주면 디스크 공간을 사람이 이해할 수 있는 형태(G, M 등)으로 표시해준다.



-

리눅스 시스템은 파일을 처리하기 위해 백그라운드에서 실행 중인 프로세스를 항상 갖고 있다.

df 출력 결과는 그 시점에서 리눅스 시스템이 생각하는 현재 값을 반영한다.

파일을 만들거나 지웠지만 아직 파일을 잠금 해제하지 않은 프로세스가 있을지도 모른다. 이와 관련된 값은 여유 공간 계산에 포함되지 않는다.



* du 명령 사용하기


-

du 명령은 특정 디렉토리(기본값은 현재 디렉토리)의 디스크 사용량을 보여준다.

이를 통해 시스템에 디스크 용량을 잡아먹는 어떤 특정한 부분이 있는지 빠르게 파악할 수 있다.

du 명령은 현재 디렉토리에 있는 모든 파일, 디렉토리 및 하위 디렉토리를 표시하고 각각의 파일이나 디렉토리가 얼마나 많은 디스크 블록을 차지하고 있는지를 보여준다.


다음의 옵션들이 있다.

-c : 나열된 모든 파일의 총계를 출력

-h : 사람이 이해 가능한 형태로 크기를 출력 (K, M, G)

-s : 각 인수를 요약




데이터 파일 작업


* 데이터 정렬


-

기본적으로 sort 명령은 세션의 기본값으로 지정된 언어의 표준 정렬 규칙을 사용해서 텍스트 파일 안에 있는 데이터 줄을 정렬한다.

sort 명령은 숫자를 문자로 해석하고 표준 문자 정렬을 수행하기 때문에 -n 옵션를 주어 숫자를 문자가 아닌 숫자로 인식하고 숫자값을 기반으로 정렬을 수행하도록 할 수 있다.

-M 옵션은 3글자로 된 월을 정렬한다.


그 밖의 많은 옵션들이 있는데.. 필요할 때 찾아서 사용해보자.



-

$ sort -t ':' -k 3 -n /etc/passwd

-t 옵션으로 필드 분리 문자를 지정하고, -k 매개변수로 어떤 필드를 정렬할 것인지 인덱스(1부터 시작)를 지정한다.



* 데이터 검색


-

큰 파일을 다루다 보면 그 안 어디엔가 파묻힌 특정 줄을 찾아야 할 때가 있다.

큰 파일을 처음부터 스크롤해나가는 대신 grep 명령으로 검색을 지시할 수 있다.

$ grep [option] [pattern] [file]

$ grep three file1

$ grep -v three file1 # -v 는 해당 구문이 없는 줄만 출력

$ grep -n three file1 # -n 은 줄 번호를 표시한다.

$ grep -c three file1 # -c 는 포함된 줄이 몇 개인지 알려준다.

$ grep -e three -e four file1 # -e 는 찾으려는 패턴이 둘 이상일 때 사용한다



-

grep 명령은 패턴과 일치하는 내용을 찾기 위해 기본 유닉스 스타일의 정규식을 사용한다.



-

egrep 명령은 grep 의 파생물로서 패턴 일치를 지정하기 위한 더 많은 특수문자를 지원하는 POSIX 확장 정규식을 쓸 수 있다.

fgrep 명령은 개행 문자로 구분되는 고정된 문자열값의 목록으로 패턴을 지정할 수 있는 파생 명령이다.



* 데이터 압축하기


-

리눅스에서 사용 가능한 압축 유틸들은 다음과 같은 것들이 있다.


bzip2 : 확장자 .bz2

compress : 확장자 .Z, 원래 유닉스 파일 압축 유틸. 인기가 사그라드는 추세

gzip : 확장자 .gz, GNU 프로젝트의 압축 유틸.

zip : 확장자 .zip, 윈도우용 PKZIP 의 유닉스 버전



-

gzip 은 리눅스에서 사용되는 가낭 인기 있는 압축 도구다.

이 패키지는 다음과 같은 파일을 포함한다.

1. 파일 압축을 위한 gzip

2. 압축된 텍스트 파일의 내용을 표시하는 gzcat

3. 압축 파일을 풀기 위한 gunzip



-

gzip 명령은 커맨드라인에서 지정한 파일을 압축한다.

하나 이상의 파일 이름을 지정하거나 와일드카드 문자를 써서 한번에 여러 파일을 압축할 수 있다.



* 데이터 아카이브


-

zip 명령은 하나의 파일로 데이터를 압축 및 보관하기 위해서는 매우 좋지만 유닉스와 리눅스 세계에서 사용되는 표준 유틸은 아니다.

유닉스와 리눅스에서 사용되는 가장 인기 있는 아카이브 도구는 단연 tar 이다.

$ tar 기능 [옵션] 대상1 대상2 ....


기능은 다음과 같다.

-A : 기존 tar 아카이브 파일에 기존의 또 다른 tar 아카이브 파일을 추가한다.

-c : 새로운 tar 아카이브 파일을 작성한다.

-d : tar 아카이브 파일과 파일시스템 사이의 차이점을 확인한다.

--delete : 기존의 tar 아카이브 파일에서 삭제한다.

-r : 기존의 tar 아카이브 파일의 끝에 파일을 추가한다.

-t : 기존의 tar 아카이브 파일에 들어있는 내용의 목록을 보여준다.

-u : 기존의 tar 아카이브 파일에 있는 같은 이름의 파일보다 최신 파일이 있다면 추가한다.

-x : 기존 아카이브 파일에서 파일을 추출한다


옵션은 다음과 같다.

-C dir : 지정된 디렉토리로 변경한다.

-f file : 결과를 파일 (또는 장치 파일)로 출력한다.

-j : 출력을 압축하기 위해 bzip2 로 보낸다.

-p : 모든 파일의 사용 권한을 유지한다.

-v : 처리된 파일의 목록을 출력한다.

-z : 출력을 압축하기 위해서 gzip 으로 보낸다.


$ tar -cvf test.tar test1/ test2/ # 아카이브

$ tar -tf test.tar # 파일 내용 출력

$ tar -xvf test.tar # 내용을 추출한다. (아카이브 해제)



-

tgz 또는 tar.gz 는 gzip 으로 압축된 tar 파일이다.

압축 해제를 위해서는 다음 명령을 사용한다.

$ tar -zxvf filename.tgz 



반응형

댓글