프로그램 감시하기
* 프로세스 엿보기
-
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
'프로그래밍 놀이터 > Script(Python)' 카테고리의 다른 글
[책 정리] 06. 리눅스 환경 변수 사용하기 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.25 |
---|---|
[책 정리] 05. 쉘을 이해하기 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.24 |
[책 정리] 03. 기본 bash 쉘 명령 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.22 |
[책 정리] 02. 쉘에 접속하기 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.21 |
[책 정리] 01-2. 리눅스 쉘 시작하기, 리눅스 배포판 - 리눅스 커맨드라인 쉘 스크립트 바이블 (0) | 2020.04.20 |
댓글