고급 Linux 커맨드 마스터 가이드, 제 2 부
저자 - Arup Nanda
게시일: 2007년 2월
이번 시리즈의제 1 부에서는 잘 알려지지 않은 커맨드, 또는 매개변수의 몇 가지 유용한 활용 방법에 대해 소개하였습니다. 이번에는 좀 더 고급 레벨의 커맨드 중에서 오라클 개발자, DBA 들에게 유용한 명령들을 설명하고자 합니다.
alias와 unalias
쉘에서 설정된 ORACLE_SID 환경 변수를 점검해야 하는 경우를 생각해 봅시다. 이때 사용되는 명령이 아래와 같습니다.
echo $ORACLE_HOME
DBA 또는 개발자들은 이 명령을 매우 자주 사용합니다. 하지만 16 자나 되는 커맨드를 매번 입력하는 것이 귀찮은 경우가 많습니다. 좀 더 간단한 방법은 없을까요?
이런 경우에 유용한 것이 alias 커맨드입니다. 예를 들어, 위와 같은 상황에서는 "os"와 같은 짧은 앨리어스를 생성하여 전체 커맨드를 축약할 수 있습니다.
alias os='echo $ORACLE_HOME'
이제 ORACLE_SID를 확인할 때 "os"만 입력하면 Linux가 앨리어스 처리된 커맨드를 실행합니다.
하지만 사용자가 시스템에서 로그아웃 했다가 다시 로그인하면, 앨리어스 설정은 사라지고 다시 alias 명령을 실행해야 합니다. 이 작업을 반복하지 않으려면 쉘의 프로파일 파일에 커맨드를 저장해 두면 됩니다. bash 쉘의 프로파일 파일은 홈 디렉토리에 위치한 .bash_profile입니다(파일 앞에 "." 기호가 있음에 주의하십시오). bourne, korn 쉘의 경우에는 .profile, 그리고 c 쉘의 경우에는 .chsrc입니다.
앨리어스는 어떤 이름으로든 설정할 수 있습니다. 예를 들어 rm이라는 앨리어스에 rm -i 커맨드를 설정하면 rm 커맨드는 항상 인터액티브 방식으로 실행됩니다.
alias rm=’rm -i’
따라서 사용자가 rm 커맨드를 입력할 때마다 Linux는 확인을 요구하며, 사용자가 "y"를 입력하지 않으면 파일을 삭제하지 않기 때문에 실수로 중요한 파일을 삭제하는 경우를 예방할 수 있습니다. 필자는 (새로운 이름으로 파일을 이동하는 명령인) mv 커맨드와 (파일 복제를 위한) cp 커맨드에도 같은 방법을 사용하고 있습니다.
필자가 자주 이용하는 몇 가지 유용한 앨리어스의 목록이 아래와 같습니다:
alias bdump='cd $ORACLE_BASE/admin/$ORACLE_SID/bdump'
alias l='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias mv='mv -i'
alias oh='cd $ORACLE_HOME'
alias os='echo $ORACLE_SID'
alias rm='rm -i'
alias tns='cd $ORACLE_HOME/network/admin'
쉘에 어떤 앨리어스가 정의되어 있는지 확인하려면 매개변수 없이 alias를 입력합니다.
하 지만 여기 작은 문제가 있습니다. 앞에서 rm 앨리어스에 rm -i 커맨드를 적용하였습니다. 이 커맨드는 사용자가 파일을 삭제하려 할 때마다 확인 프롬프트를 띄울 것입니다. 그렇다면 확인 과정을 거치지 않고 많은 수의 파일을 삭제하려 한다면 어떻게 해야 할까요?
방법은 간단합니다. 앨리어스를 비활성화하고 커맨드가 직접 실행되도록 하기 위해서는 아래와 같이 커맨드에 작은 따옴표 두 개를 넣어주면 됩니다.
$ ''rm *
앞의 기호가 큰 따옴표(")가 아닌 두 개의 작은 따옴표('')임에 주의하시기 바랍니다. 이와 같은 방법으로 rm 앨리어스를 비활성화할 수 있습니다. 또 다른 방법으로 백슬래쉬를 이용할 수 있습니다.
$ \rm *
앞에서 정의한 앨리어스를 제거하려면 unalias 커맨드를 사용합니다.
$ unalias rm
ls
ls 커맨드는 가장 자주 사용되는 명령의 하나이지만, 그 잠재력이 충분히 활용되는 경우는 드뭅니다. 매개변수를 사용하지 않은 경우, ls 커맨드는 테이블 포맷으로 모든 파일과 디렉토리를 표시합니다.
$ ls
admin has mesg precomp
apex hs mgw racg
assistants install network rdbms
... 뒷부분 생략 ...
리스트 포맷으로 결과를 확인하려면 -1(문자 "l"이 아닌 숫자 1임에 주의합니다) 옵션을 사용합니다.
$ ls -1
admin
apex
assistants
... 뒷부분 생략 ...
이 옵션은 커맨드 실행 결과로부터 값을 추출하여 처리 작업을 수행하는 쉘 스크립트 환경에서 유용하게 활용됩니다.
파일, 디렉토리의 모든 속성을 표시하는 -l (숫자 "1"이 아닌 문자"l") 옵션은 자주 사용해 보셨을 것입니다. 이 옵션에 대해 좀 더 알아 봅시다.
$ ls -l
total 272
drwxr-xr-x 3 oracle oinstall 4096 Sep 3 03:27 admin
drwxr-x--- 7 oracle oinstall 4096 Sep 3 02:32 apex
drwxr-x--- 7 oracle oinstall 4096 Sep 3 02:29 assistants
첫 번째 컬럼은 파일의 타입과 권한 설정을 표시하고 있습니다. 여기서 "d"는 디렉토리, "-"는 일반 파일, "c"는 캐릭터 디바이스, "b"는 블록 디바이스, "p"는 파이프, "l"(대문자 I가 아닌 소문자 l)은 심볼릭 링크를 의미합니다.
여기서 매우 유용한 옵션의 하나로 --color가 있습니다. 이 옵션은 파일의 유형을 기준으로 색상을 다르게 표시합니다. 스크린샷의 예가 아래와 같습니다:
file1과 file2는 일반 파일입니다. link1은 심볼릭 링크이며 붉은색으로 표시되어 있습니다. dir1은 디렉토리로 노란색으로 표시됩니다. pipe1은 네임드 파이프로 역시 구분이 쉽도록 다른 색으로 표현되고 있습니다.
I 일부 Linux 배포판의 경우 ls 커맨드에 ls --color;와 같은 앨리어스가 기본적으로 적용되어 있기도 합니다. 이러한 접근법은 그리 바람직하지 않습니다. 결과가 위와 같이 표시되는 경우는 더욱 그러합니다. 위 결과의 색상을 변경할 수는 있지만 앨리어스를 비활성화하는 것이 더 빠른 방법일 것입니다.
$ alias ls="''ls"
또 다른 유용한 옵션으로 -F가 있습니다. 이 매개변수는 각 파일의 타입별로 심볼을 덧붙입니다. 디렉토리에는 "/"가, 심볼릭 링크에는 "@"이, 네임드 파이프에는 "l"이 붙습니다.
$ ls -F
dir1/ file1 file2 link1@ pipe1|
디렉토리 내에 서브디렉토리가 존재하고 이 디렉토리의 구조만을 확인하고자 하는 경우를 생각해 봅시다. ls -l을 사용하면 서브디렉토리의 컨텐트도 함께 표시됩니다. 아래와 같은 디렉토리 구조를 가정해 봅시다.
/dir1
+-->/subdir1
+--> subfile1
+--> subfile2
디렉토리 dir1은 서브디렉토리 subdir1과 두 개의 파일, subfile1과 subfile2를 가집니다. 디렉토리의 속성만을 확인하고자 하는 경우 아래와 같이 실행합니다.
$ ls -l dir1
total 4
drwxr-xr-x 2 oracle oinstall 4096 Oct 14 16:52 subdir1
-rw-r--r-- 1 oracle oinstall 0 Oct 14 16:48 subfile1
-rw-r--r-- 1 oracle oinstall 0 Oct 14 16:48 subfile2
여기에서는 디렉토리 dir1이 표시되지 않고 있습니다. 그 대신 디렉토리의 컨텐트가 표시됩니다. 이러한 결과는 일반적으로 우리가 기대하는 것과는 다릅니다. 디렉토리 dir1만을 조회하고자 할 때에는 -d 커맨드를 사용해야 합니다.
$ ls -dl dir1
drwxr-xr-x 3 oracle oinstall 4096 Oct 14 16:52 dir1
If you notice the output of the following ls -l output:
-rwxr-x--x 1 oracle oinstall 10457761 Apr 6 2006 rmanO
-rwxr-x--x 1 oracle oinstall 10457761 Sep 23 23:48 rman
-rwsr-s--x 1 oracle oinstall 93300507 Apr 6 2006 oracleO
-rwx------ 1 oracle oinstall 93300507 Sep 23 23:49 oracle
파일의 사이즈는 바이트 단위로 표시되고 있습니다. 파일의 크기가 작을 때에는 문제가 없지만 파일 용량이 큰 경우에는 길게 나열된 숫자를 읽기가 어려울 수 있습니다. 이 경우 "-h" 옵션을 사용하면 보다 읽기 쉬운 포맷으로 파일 사이즈가 표시됩니다.
$ ls -lh
-rwxr-x--x 1 oracle oinstall 10M Apr 6 2006 rmanO
-rwxr-x--x 1 oracle oinstall 10M Sep 23 23:48 rman
-rwsr-s--x 1 oracle oinstall 89M Apr 6 2006 oracleO
-rwx------ 1 oracle oinstall 89M Sep 23 23:49 oracle
위에서 파일 사이즈가 M(메가바이트) 또는 K(킬로바이트)로 표시됨을 확인할 수 있습니다.
$ ls -lr
매개변수 -r은 역순으로 결과를 표시합니다. 아래 커맨드를 실행하면 결과가 알파벳 역순으로 표시됩니다.
$ ls -lR
-R 옵션을 사용하면 ls 커맨드가 재귀적으로 실행되며, 따라서 서브디렉토리와 서브디렉토리의 컨텐트가 함께 표시됩니다.
파일 크기의 순서대로 표시하고 싶다면 어떻게 해야 할까요? 이를 위해 -S 매개변수가 지원되고 있습니다.
$ ls -lS
total 308
-rw-r----- 1 oracle oinstall 52903 Oct 11 18:31 sqlnet.log
-rwxr-xr-x 1 oracle oinstall 9530 Apr 6 2006 root.sh
drwxr-xr-x 2 oracle oinstall 8192 Oct 11 18:14 bin
drwxr-x--- 3 oracle oinstall 8192 Sep 23 23:49 lib
xargs
대부분의 Linux 커맨드는 파일 목록, 문자열 등의 결과를 출력하는 것을 목적으로 실행됩니다. 하지만 앞에서 실행된 결과의 일부를 다른 커맨드의 매개변수로 활용해야 하는 경우가 있습니다. 예를 들어 파일의 유형(실행 파일, ASCII 텍스트 등)을 확인하기 위한 file 커맨드에서 파일네임만을 출력하도록 한 뒤, 이 결과를 ls -l 커맨드에 매개변수로 전달하여 타임스탬프를 확인하고자 하는 상황을 생각해 볼 수 있습니다. xargs 커맨드가 바로 이러한 목적으로 사용됩니다. 이 커맨드를 실행하면 다른 커맨드의 결과를 매개변수로 활용할 수 있습니다. 아래와 같은 명령을 가정해 봅시다.
file -Lz * | grep ASCII | cut -d":" -f1 | xargs ls -ltr위 커맨드의 문자열을 자세히 분석해 보겠습니다. 먼저, file -Lz *는 파일이 심볼릭 링크인지 또는 압축 파일인지를 확인합니다. 그리고 결과는 다음 커맨드인 grep ASCII 전달됩니다. 여기서 "ASCII" 문자열이 검색되어 아래와 같은 형태의 출력이 생성됩니다.
alert_DBA102.log: ASCII English text여기에서는 파일네임만이 관심 사항이기 때문에 다음 커맨드 cut -d":" -f1을 실행하여 첫 번째 필드만 표시되도록 합니다.
alert_DBA102.log.Z: ASCII text (compress'd data 16 bits)
dba102_asmb_12307.trc.Z: ASCII English text (compress'd data 16 bits)
dba102_asmb_20653.trc.Z: ASCII English text (compress'd data 16 bits)
alert_DBA102.log
alert_DBA102.log.Z
dba102_asmb_12307.trc.Z
dba102_asmb_20653.trc.Z
이제 ls -l 커맨드에 한 번에 하나씩 위의 목록을 매개변수로 전달합니다. xargs 커맨드가 바로 이러한 목적으로 사용됩니다. 마지막에서 xargs ls -ltr 명령은 전달된 결과에 대해 ls -ltr을 실행합니다. 결과적으로 아래와 같은 명령이 순차적으로 실행됩니다.
ls -ltr alert_DBA102.log
ls -ltr alert_DBA102.log.Z
ls -ltr dba102_asmb_12307.trc.Z
ls -ltr dba102_asmb_20653.trc.Z
xargs은 독자적으로 사용되는 명령은 아니지만, 다른 커맨드와 조합되었을 때 매우 강력한 기능을 발휘합니다.
또 다른 예로 파일의 라인 수를 카운트하는 경우를 생각해 볼 수 있습니다.
$ file * | grep ASCII | cut -d":" -f1 | xargs wc -l
47853 alert_DBA102.log
19 dba102_cjq0_14493.trc
29053 dba102_mmnl_14497.trc
154 dba102_reco_14491.trc
43 dba102_rvwr_14518.trc
77122 total
(참고: 위와 동일한 작업을 아래 명령을 통해 실행할 수도 있습니다.)
$ wc -l ‘file * | grep ASCII | cut -d":" -f1 | grep ASCII | cut -d":" -f1‘
Linux는 여러 가지 방법으로 동일한 작업을 실행할 수 있도록 지원하고 있습니다. 사용자는 상황에 따라 가장 적절한 방법을 사용하면 됩니다.
같은 방법을 사용하여 디렉토리 내의 여러 파일의 이름을 한꺼번에 변경할 수 있습니다.
$ ls | xargs -t -i mv {} {}.bak
"-i" 옵션은 xargs 커맨드가 "{}" 부분을 각 아이템의 이름으로 대치하도록 지시하고 있습니다. 또 "-t" 옵션은 xargs가 실행 이전에 커맨드를 출력하도록 합니다.
vi를 이용하여 편집할 파일을 여는 과정에서도 활용이 가능합니다.
$ file * | grep ASCII | cut -d":" -f1 | xargs vi
이 커맨드는 vi를 사용하여 파일을 한 번에 하나씩 열도록 지시하고 있습니다. 이 방법은 여러 개의 파일을 검색한 후 편집을 위해 여는 경우 유용합니다.
xargs 커맨드는 다양한 옵션을 지원합니다. 가장 유용한 옵션으로 "-p"를 들 수 있을 것입니다. "-p"는 인터액티브 작업을 위해 사용됩니다.
$ file * | grep ASCII | cut -d":" -f1 | xargs -p vi
vi alert_DBA102.log dba102_cjq0_14493.trc dba102_mmnl_14497.trc
dba102_reco_14491.trc dba102_rvwr_14518.trc ?...
위에서 xarg는 각 커맨드가 실행하기 전에 확인 프롬프트를 띄우고 있습니다. 사용자가 "y"를 누르면 커맨드가 실행됩니다. 파일의 이동, 덮어쓰기 등 잠재적인 위험성을 갖는 작업을 사용하는 경우 이 방법이 매우 유용하게 활용될 수 있을 것입니다.
"t" 옵션은 "verbose" 모드입니다. 실행될 커맨드가 무엇인지 표시하므로 디버깅 과정에서 유용합니다.
xargs 커맨드의 매개변수로 아무런 출력도 입력되지 않는 경우에는 어떻게 될까요? 다음과 같은 경우를 생각해 봅시다.
$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t wc -l"SSSSSS" 문자열의 검색 결과 매치가 반환되지 않았습니다. 따라서 xargs에는 아무런 입력도 전달되지 않습니다(-t 옵션을 이용해서 이를 확인할 수 있습니다). 경우에 따라서는 처리할 대상이 존재하지 않는 경우 xargs의 실행을 중단해야 할 수도 있습니다. 이를 위해 사용되는 것이 -r 옵션입니다.
wc -l
0
$
$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t -r wc -l
$
이 커맨드는 실행할 대상이 존재하지 않는 경우 종료 처리합니다.
rm 커맨드와 xargs 커맨드를 함께 사용해서 여러 파일을 한꺼번에 삭제하는 경우를 생각해 봅시다. rm이 받아들일 수 있는 매개변수의 수에는 한계가 있습니다. 입력되는 매개변수의 수가 이를 초과하는 경우에는 어떻게 해야 할까요? -n 옵션을 사용하면 xargs에서 사용하는 매개변수의 수를 제한할 수 있습니다.
커맨드 라인 별로 매개변수의 수를 2 개로 제한하는 방법이 아래와 같습니다. 5 개의 파일이 xargs ls -ltr로 전달되었더라도, 2 개의 파일만이 한 번에 ls -ltr로 전달됩니다.
$ file * | grep ASCII | cut -d":" -f1 | xargs -t -n2 ls -ltr
ls -ltr alert_DBA102.log dba102_cjq0_14493.trc
-rw-r----- 1 oracle dba 738 Aug 10 19:18 dba102_cjq0_14493.trc
-rw-r--r-- 1 oracle dba 2410225 Aug 13 05:31 alert_DBA102.log
ls -ltr dba102_mmnl_14497.trc dba102_reco_14491.trc
-rw-r----- 1 oracle dba 5386163 Aug 10 17:55 dba102_mmnl_14497.trc
-rw-r----- 1 oracle dba 6808 Aug 13 05:21 dba102_reco_14491.trc
ls -ltr dba102_rvwr_14518.trc
-rw-r----- 1 oracle dba 2087 Aug 10 04:30 dba102_rvwr_14518.trc
같은 방법을 사용하여 디렉토리 내의 여러 파일의 이름을 한꺼번에 변경할 수 있습니다.
$ ls | xargs -t -i mv {} {}.bak
"-i" 옵션은 xargs 커맨드가 "{}" 부분을 각 아이템의 이름으로 대치하도록 지시하고 있습니다.
rename
잘 아시는 것처럼 mv 커맨드는 파일의 이름을 변경하는 용도로 사용됩니다. 예를 들어,
$ mv oldname newname위 명령은 파일네임을 oldname에서 newname으로 변경합니다. 하지만 파일네임을 미리 알고 있지 못한 경우에는 어떻게 해야 할까요? 이 경우 rename 커맨드가 매우 유용하게 활용됩니다.
rename .log .log.‘date +%F-%H:%M:%S‘ *
위 명령은 .log 확장자를 갖는 모든 파일을 .log.
find
오 라클 사용자들이 가장 자주 사용하는 커맨드 중 하나가 find입니다. 이미 여러분들도 find를 이용하여 디렉토리 내의 파일을 검색하는 방법에 대해 알고 있을 것입니다. 현재 디렉토리에서 "file"이라는 문자열로 시작되는 파일을 검색하는 예가 아래와 같습니다.
$ find . -name "file*"
./file2
./file1
./file3
./file4
만일 FILE1, FILE2와 같은 이름을 검색하려면 어떻게 해야 할까요? 이 경우 -name "file*" 옵션으로는 매치가 불가능합니다. 검색 과정에서 대소문자 구분을 하지 않으려면 -iname 옵션을 사용해야 합니다.
$ find . -iname "file*"
./file2
./file1
./file3
./file4
./FILE1
./FILE2
검색 결과를 특정 유형의 파일로만 제한할 수도 있습니다. 예를 들어, 위 커맨드는 일반 파일, 디렉토리, 심볼릭 링크 등의 모든 파일 유형을 표시합니다. 일반 파일로만 검색을 한정하려는 경우에는 -type f 매개변수를 사용할 수 있습니다.
$ find . -name "orapw*" -type f
./orapw+ASM
./orapwDBA102
./orapwRMANTEST
./orapwRMANDUP
./orapwTESTAUX
-type에는 f(일반 파일), l(심볼릭 링크), d(디렉토리), b(블록 디바이스), p(네임드 파이프), c(캐릭터 디바이스), s(소켓) 등의 옵션이 지원됩니다.
위 커맨드를 약간 수정해서 제 1 부에서 설명한 file 커맨드와 조합해 보겠습니다. file 커맨드를 사용하면 파일의 유형을 확인할 수 있습니다. 이 명령을 이용하여 find 커맨드의 출력을 후처리해 봅시다. -exec 매개변수는 매개변수 뒤에 위치한 커맨드를 실행합니다. 위의 경우 find를 실행한 후 file를 실행해야 합니다.
$ find . -name "*oraenv*" -type f -exec file {} \;
./coraenv: Bourne shell script text executable
./oraenv: Bourne shell script text executable
위 명령은 ASCII 텍스트 파일이 쉘 스크립트인지의 여부를 확인하려는 경우 유용합니다.
-exec을 -ok로 대체하는 경우에는 커맨드가 실행되기 전에 확인 프롬프트가 표시됩니다. 그 예가 아래와 같습니다.
$ find . -name "sqlplus*" -ok {} \;위에서는 쉘에서 "sqlplus"로 시작하는 모든 프로그램을 검색한 후, 검색된 프로그램을 실행하도록 명령하고 있습니다. -ok와 {} 사이에 아무 것도 없기 때문에, 커맨드는 검색된 파일을 그저 실행하기만 합니다. 결과로 두 개의 파일(sqlplus와 sqlplusO)가 검색되었으며, 각 커맨드에 대해 실행 여부를 묻는 프롬프트가 뜹니다. 사용자는 "sqlplus"에 대한 프롬프트에서 "y"를 입력하여 커맨드를 실행하였습니다. 커맨드 실행이 완료되면 두 번째 파일(sqlplusO)의 실행 여부를 묻는 프롬프트가 뜹니다. 여기에서는 "n"을 입력하였으므로 실행되지 않았습니다.
< {} ... ./sqlplus > ? y
SQL*Plus: Release 9.2.0.5.0 - Production on Sun Aug 6 11:28:15 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Enter user-name: / as sysdba
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Oracle Data Mining options
JServer Release 9.2.0.5.0 - Production
SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Oracle Data Mining options
JServer Release 9.2.0.5.0 - Production
< È* ... ./sqlplusO > ? n
$
오라클 사용자를 위한 팁
오라클은 트레이스 파일, 로그 파일, 덤프 파일 등의 다양한 파일을 생성, 관리합니다. 이 파일을 정기적으로 삭제하지 않는 경우 파일 시스템의 용량 부족으로 데이터베이스 실행이 중단될 수도 있습니다.
이런 문제를 예방하기 위해, "trc" 확장자를 갖는 파일을 검색한 후 3 일 이상 경과한 파일을 삭제하도록 명령할 수 있습니다. 이를 위한 명령이 아래와 같습니다.
find . -name "*.trc" -ctime +3 -exec rm {} \;
3일 이상 경과한 파일을 강제로 삭제하려면 -f 옵션을 사용합니다.
find . -name "*.trc" -ctime +3 -exec rm -f {} \;
아래 명령은 파일의 목록만을 표시합니다.
find . -name "*.trc" -ctime +3 -exec ls -l {} \;
m4
이 커맨드는 입력 파일을 받아들인 뒤 파일 내의 문자열을 매개변수 값으로 대체합니다. 입력 파일의 예가 아래와 같습니다.
$ cat temp
The COLOR fox jumped over the TYPE fence.
여기서 "COLOR"를 "brown"으로, "TYPE"을 "broken"으로 대체해 봅시다.
$ m4 -DCOLOR=brown -DTYPE=broken temp
The brown fox jumped over the broken fence.
또 같은 방법으로 "white", "high" 문자열로 대체해 보겠습니다.
$ m4 -DCOLOR=white -DTYPE=high temp
The white fox jumped over the high fence.
whence와 which
이 두 가지 커맨드는 실행파일이 사용자의 PATH 환경 변수에 저장되어 있는지 확인하기 위해 사용됩니다. 실행 파일이 경로 상에 존재하는 경우, 두 명령은 유사한 결과를 표시합니다.
$ which sqlplus
/u02/app/oracle/products/10.2.0.1/db1/bin/sqlplus
$ whence sqlplus
/u02/app/oracle/products/10.2.0.1/db1/bin/sqlplus
위의 결과는 동일합니다. 하지만 실행 파일이 경로 상에 존재하지 않는 경우에는 출력 결과가 달라집니다. which 커맨드는 메시지를 명시적으로 표시합니다.
$ which sqlplus1
/usr/bin/which: no sqlplus1 in (/u02/app/oracle/products/10.2.0.1/db1/bin:/usr
/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin)
이에 반해 whence 커맨드는 아무런 메시지도 표시하지 않으며,
$ whence sqlplus1]
바로 쉘 프롬프트를 반환합니다. 이 명령은 실행 파일이 경로 상에 존재하지 않는 경우 (메시지를 확인하지 않고) 실행을 바로 취소하고자 하는 경우 유용합니다.
$ whence invalid_command
$ which invalid_command
which: no invalid_command in (/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:
/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:
/usr/bin/X11:/usr/X11R6/bin:/root/bin)
whence 명령은 경로 상에 실행 파일이 검색되지 않은 경우 메시지를 반환하지 않으며, 대신 0이 아닌 리턴 코드를 반환합니다. 쉘 스크립트에서 반환된 리턴 코드를 이용할 수도 있습니다.
RC=‘whence myexec‘
If [ $RC -ne "0" ]; then
echo "myexec is not in the $PATH"
fi
유용한 옵션으로 -i 옵션이 있습니다. 이 옵션은 실행파일과 앨리어스를 함께 표시해 줍니다. 앞에서 rm 커맨드를 앨리어스로 설정한 바 있습니다. 따라서 rm은 커맨드로도, 앨리어스로도 존재합니다.
$ which ls
/bin/ls
$ which -i ls
alias ls='ls --color=tty'
/bin/ls
which 커맨드는 기본적으로 경로 상에서 검색된 첫 번째 실행파일만을 표시합니다. 따라서 경로 상의 다른 디렉토리에 위치한 실행파일은 무시됩니다. -a 옵션을 사용하면 모든 실행파일의 목록을 확인할 수 있습니다.
$ which java
/usr/bin/java
$ which -a java
/usr/bin/java
/home/oracle/oracle/product/11.1/db_1/jdk/jre/bin/java
top
Linux 데이터베이스를 관리하는 오라클 DBA에게 가장 유용한 커맨드로 top을 꼽을 수 있을 것입니다. 시스템의 성능이 저하되어 어떤 프로세스가 CPU와 메모리를 잡아먹고 있는지 확인해야 하는 경우를 예로 들어 봅시다. 이때 Top 프로세스 리스트를 반환하기 위해 사용되는 명령이 바로 top입니다.
다 른 커맨드들과 달리 top은 결과 출력 후에도 실행을 종료하지 않으며, 스크린 상에 계속적으로 새로운 정보를 뿌립니다. 그러므로 top을 실행한 후 스크린을 그대로 내버려 두면 최신의 정보를 계속 확인할 수 있습니다. 커맨드를 종료하고 쉘로 빠져나가려면 Control-C를 눌러야 합니다.
$ top
18:46:13 up 11 days, 21:50, 5 users, load average: 0.11, 0.19, 0.18
151 processes: 147 sleeping, 4 running, 0 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 12.5% 0.0% 6.7% 0.0% 0.0% 5.3% 75.2%
Mem: 1026912k av, 999548k used, 27364k free, 0k shrd, 116104k buff
758312k actv, 145904k in_d, 16192k in_c
Swap: 2041192k av, 122224k used, 1918968k free 590140k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
451 oracle 15 0 6044 4928 4216 S 0.1 0.4 0:20 0 tnslsnr
8991 oracle 15 0 1248 1248 896 R 0.1 0.1 0:00 0 top
1 root 19 0 440 400 372 S 0.0 0.0 0:04 0 init
2 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 keventd
3 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kapmd
4 root 34 19 0 0 0 SWN 0.0 0.0 0:00 0 ksoftirqd/0
7 root 15 0 0 0 0 SW 0.0 0.0 0:01 0 bdflush
5 root 15 0 0 0 0 SW 0.0 0.0 0:33 0 kswapd
6 root 15 0 0 0 0 SW 0.0 0.0 0:14 0 kscand
8 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kupdated
9 root 25 0 0 0 0 SW 0.0 0.0 0:00 0 mdrecoveryd
... 뒷부분 생략 ...
위의 실행 결과를 자세히 살펴 봅시다. 첫 번째 라인이 아래와 같습니다.
18:46:13 up 11 days, 21:50, 5 users, load average: 0.11, 0.19, 0.18
여기에서는 현재 시간(18:46:13)과 함께 시스템이 11일간 실행되었으며 21시간 50초에 걸쳐 시스템이 작업을 실행했음을 표시하고 있습니다. 시스템의 부하는 최근 1분, 5분, 15분의 평균(0.11, 0.19, 0.18)으로 표시됩니다. (위의 정보는 uptime 커맨드에서도 확인할 수 있습니다.)
평균 부하 정보가 필요하지 않은 경우라면 "l"을 입력하여 출력을 비활성화할 수 있습니다. 다시 l을 누르면 정보가 표시됩니다. 두 번째 라인은 아래와 같습니다.
151 processes: 147 sleeping, 4 running, 0 zombie, 0 stopped
위에서는 프로세스의 수, 실행 중인 프로세스, 슬립 상태의 프로세스 수가 표시됩니다. 다음은 3 번째, 4 번째 라인입니다.
CPU states: cpu user nice system irq softirq iowait idle
total 12.5% 0.0% 6.7% 0.0% 0.0% 5.3% 75.2%
여기서는 CPU 사용률 정보가 표시되고 있습니다. 위에서는 사용자 프로세스가 12.5%를, 시스템이 6.7%를 사용하고 있음을 확인할 수 있습니다. 오라클 프로세스는 사용자 프로세스에 포함됩니다. "t"를 누르면 위의 라인을 활성화/비활성화할 수 있습니다. CPU가 두 개 이상 존재하는 경우에는, 각 CPU별로 하나의 라인이 표시됩니다.
그 다음 2 개의 라인을 봅시다.
Mem: 1026912k av, 1000688k used, 26224k free, 0k shrd, 113624k buff
758668k actv, 146872k in_d, 14460k in_c
Swap: 2041192k av, 122476k used, 1918716k free 591776k cached
사용 가능한 메모리와 사용 중인 메모리 용량이 표시되고 있습니다. 전체 메모리는 "1026912k av", 약 1GB이며 이중 26224k(26MB)가 여유 상태입니다. 스왑 공간은 2GB이지만 거의 사용되지 않고 있습니다. 이 부분을 비활성화/활성화하려면 "m"을 누릅니다.
출력의 나머지 부분은 프로세스를 테이블 형태로 표시하고 있습니다. 각 컬럼에 대한 설명이 아래와 같습니다.
컬럼 | 설명 |
PID | 프로세스의 프로세스 ID |
USER | 프로세스를 실행 중인 사용자 |
PRI | 프로세스의 우선순위 |
NI | nice 값: 값이 높을 수록 태스크의 우선순위가 낮음을 의미 |
SIZE | 프로세스가 사용하는 메모리 (코드+데이터+스택) |
RSS | 프로세스가 사용하는 물리적 메모리 |
SHARE | 프로세스가 사용하는 공유 메모리 |
STAT | 프로세스의 상태 정보로 다음과 같은 코드로 표시됨: W – Swapped out process N – positive nice value |
%CPU | 프로세스의 CPU 사용률 |
%MEM | 프로세스의 메모리 사용률 |
TIME | 프로세스가 사용하는 전체 CPU 타임 |
CPU | 멀티-프로세서 시스템의 경우 이 컬럼은 프로세스가 실행 중인 CPU의 ID를 의미함 |
COMMAND | 프로세스가 실행한 커맨드 |
top 명령이 실행되는 동안 키를 눌러 디스플레이 포맷을 변경할 수도 있습니다. 대문자 M 키를 누르면 출력이 메모리 사용률 순서로 정렬됩니다. (소문자 m을 누르면 메모리 사용량 요약 라인이 비활성화됨을 참고하시기 바랍니다.) 이 명령은 어떤 프로세스가 메모리를 가장 많이 사용하고 있는지 확인할 때 유용합니다. 출력 예가 아래와 같습니다:
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
31903 oracle 15 0 75760 72M 72508 S 0.0 7.2 0:01 0 ora_smon_PRODB2
31909 oracle 15 0 68944 66M 64572 S 0.0 6.6 0:03 0 ora_mmon_PRODB2
31897 oracle 15 0 53788 49M 48652 S 0.0 4.9 0:00 0 ora_dbw0_PRODB2
지금까지 출력 결과를 분석해 보았습니다. 이제 커맨드 라인 매개변수를 이용하는 방법을 알아 봅시다.
가장 유용한 매개변수인 -d는 스크린 리프레시 간격을 조정합니다. 1 초 단위로 화면을 갱신하려면 top -d 1을 입력합니다.
그 밖에 유용한 옵션으로 -p가 있습니다. 이 옵션은 몇 가지 프로세스에 대해서만 모니터링을 수행하고자 하는 경우 사용합니다. 13609, 13608, 13554 프로세스를 모니터링하는 방법이 다음과 같습니다.
top -p 13609 -p 13608 -p 13554
이 명령은 지정된 프로세스에 대해서만 top 커맨드를 실행합니다.
오라클 사용자를 위한 팁
top 유틸리티가 데이터베이스 서버의 성능 분석을 위해 매우 유용하게 활용된다는 사실은 굳이 강조할 필요도 없을 것입니다. top 커맨드 실행 결과의 일부가 아래와 같습니다.
20:51:14 up 11 days, 23:55, 4 users, load average: 0.88, 0.39, 0.27
113 processes: 110 sleeping, 2 running, 1 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 1.0% 0.0% 5.6% 2.2% 0.0% 91.2% 0.0%
Mem: 1026912k av, 1008832k used, 18080k free, 0k shrd, 30064k buff
771512k actv, 141348k in_d, 13308k in_c
Swap: 2041192k av, 66776k used, 1974416k free 812652k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16143 oracle 15 0 39280 32M 26608 D 4.0 3.2 0:02 0 oraclePRODB2...
5 root 15 0 0 0 0 SW 1.6 0.0 0:33 0 kswapd
... 뒷부분 생략 ...
위 결과를 자세히 분석해 봅시다. 먼저 CPU states 항목의 "idle" 컬럼을 주목하십시오. 0.0%로 표시되고 있습니다. 이는 CPU가 100% 사용 중임을 의미합니다. 그렇다면 어떤 작업에 CPU가 사용되고 있는지 궁금해 하는 것이 당연합니다. 왼쪽의 "system" 컬럼을 보면 5.6%로 표시되고 있습니다. 따라서 시스템 자체적으로는 많은 작업을 실행하고 있지 않습니다. 좀 더 왼쪽의 "user" 컬럼은 1.0%로 표시되고 있습니다. 여기서 사용자 프로세스에는 오라클이 포함됩니다. 따라서 오라클이 CPU 사이클을 많이 소모하지 않고 있음을 알 수 있습니다. 그렇다면 CPU 사용의 주범은 무엇일까요?
그 해답을 같은 라인에서 확인할 수 있습니다. "iowait" 컬럼 하단의 오른쪽을 보면 91.2%가 표시되고 있습니다. 이제 답이 나왔습니다. CPU는 전체 시간 중 91.2%를 IO를 대기하는데 소비하고 있는 것입니다.
그 렇다면 IO wait가 이처럼 높은 이유는 무엇일까요? 그 해답도 확인할 수 있습니다. 바로 가장 많은 CPU를 사용하는 프로세스의 PID입니다: 16143. 아래 쿼리를 실행하여 프로세스가 어떤 작업을 실행 중인지 확인할 수 있습니다.
select s.sid, s.username, s.program
from v$session s, v$process p
where spid = 16143
and p.addr = s.paddr
/
SID USERNAME PROGRAM
------------------- -----------------------------
159 SYS rman@prolin2 (TNS V1-V3)
바로 rman 프로세스가 많은 IO wait를 발생시키고 있습니다. 이 분석 결과를 바탕으로 후속 조치를 취할 수 있을 것입니다.
skill과 snice
앞 에서 CPU를 가장 많이 사용하는 리소스를 확인하는 방법에 대해 배워 보았습니다. 프로세스가 많은 CPU와 메모리를 사용하고 있지만 이 프로세스를 kill하기를 원치 않는 경우에는 어떻게 해야 할까요? 아래와 같은 top 출력 결과를 생각해 봅시다.
$ top -c -p 16514
23:00:44 up 12 days, 2:04, 4 users, load average: 0.47, 0.35, 0.31
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 0.0% 0.6% 8.7% 2.2% 0.0% 88.3% 0.0%
Mem: 1026912k av, 1010476k used, 16436k free, 0k shrd, 52128k buff
766724k actv, 143128k in_d, 14264k in_c
Swap: 2041192k av, 83160k used, 1958032k free 799432k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16514 oracle 19 4 28796 26M 20252 D N 7.0 2.5 0:03 0 oraclePRODB2...
프로세스 16514가 가장 많은 메모리를 사용하고 있음을 확인했다면 skill 커맨드를 사용해서 이 프로세스를 죽이는(kill) 대신 얼려버릴(freeze) 수 있습니다.
$ skill -STOP 1
그런 다음 top을 다시 실행해 봅시다.
23:01:11 up 12 days, 2:05, 4 users, load average: 1.20, 0.54, 0.38
1 processes: 0 sleeping, 0 running, 0 zombie, 1 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 2.3% 0.0% 0.3% 0.0% 0.0% 2.3% 94.8%
Mem: 1026912k av, 1008756k used, 18156k free, 0k shrd, 3976k buff
770024k actv, 143496k in_d, 12876k in_c
Swap: 2041192k av, 83152k used, 1958040k free 851200k cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16514 oracle 19 4 28796 26M 20252 T N 0.0 2.5 0:04 0 oraclePRODB2...
CPU는 94%에서 0%로 떨어졌습니다. 프로세스의 실행이 실질적으로 동결된 것입니다. 사용자는 나중에 원하는 시점에 이 프로세스를 다시 깨울 수 있습니다.
$ skill -CONT 16514
이 방법은 다른 중요한 프로세스의 실행을 위해 프로세스를 임시로 중단하려는 경우 매우 유용합니다.
커맨드의 활용 방법은 매우 다양합니다. "oracle" 사용자의 모든 프로세스를 중단하는 방법이 아래와 같습니다.
$ skill -STOP oracle
사용자 이외에도 커맨드, 터미널 ID 등의 정보를 매개변수로 사용할 수 있습니다. 아래 명령은 모든 rman 커맨드의 실행을 중단합니다.
$ skill -STOP rman
skill은 입력된 매개변수가 프로세스 ID인지, 사용자 아이디인지, 커맨드인지를 자체적으로 파악한 후 그에 따라 행동을 취합니다. 이러한 동작 방식이 때로는 문제가 될 수도 있습니다. 예를 들어 사용자와 커맨드가 동일한 이름을 갖는 경우를 생각해 볼 수 있습니다. 그 대표적인 예가 "oracle" 사용자에 의해 실행되는 "oracle" 프로세스입니다. 따라서 "oracle"이라는 이름의 프로세스 실행을 중단하기 위해 아래와 같이 입력한 경우,
$ skill -STOP oracle
"oracle" 사용자의 모든 프로세스와 세션도 함께 중단됩니다. 이러한 불확실성을 해소하려면 매개변수의 유형을 별도로 지정해 주어야 합니다. 예를 들어 "oracle"이라는 이름의 커맨드 실행을 중단하기 위한 명령이 아래와 같습니다.
$ skill -STOP -c oracle
snice 커맨드의 실행 방법도 위와 유사합니다. 이 커맨드는 프로세스를 중단하는 대신 프로세스의 우선순위를 낮춥니다. 먼저, top 실행 결과를 점검해 봅시다.
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
3 root 15 0 0 0 0 RW 0.0 0.0 0:00 0 kapmd
13680 oracle 15 0 11336 10M 8820 T 0.0 1.0 0:00 0 oracle
13683 oracle 15 0 9972 9608 7788 T 0.0 0.9 0:00 0 oracle
13686 oracle 15 0 9860 9496 7676 T 0.0 0.9 0:00 0 oracle
13689 oracle 15 0 10004 9640 7820 T 0.0 0.9 0:00 0 oracle
13695 oracle 15 0 9984 9620 7800 T 0.0 0.9 0:00 0 oracle
13698 oracle 15 0 10064 9700 7884 T 0.0 0.9 0:00 0 oracle
13701 oracle 15 0 22204 21M 16940 T 0.0 2.1 0:00 0 oracle
이제 "oracle" 프로세스의 우선순위를 4 단계 낮춥니다. 여기서는 숫자가 높을 수록 우선순위가 낮음을 의미합니다.
$ snice +4 -u oracle
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
16894 oracle 20 4 38904 32M 26248 D N 5.5 3.2 0:01 0 oracle
NI 컬럼(nice 값)이 4, priority가 15에서 4로 변경되었음을 확인할 수 있습니다.
Arup Nanda (arup@proligence.com )는 12 년 이상의 경력을 보유한 오라클 DBA로, 성능 튜닝, 보안, 재해 복구 등 다방면에 걸친 데이터베이스 운영 경험을 가지고 있습니다. 그는
[출처] http://www.oracle.com/technology/global/kr/pub/articles/advanced-linux-commands/part2.html
'LinuX' 카테고리의 다른 글
[Linux] sar 명령어를 통한 시스템 모니터링 (0) | 2015.02.12 |
---|---|
split 명령어 (0) | 2014.10.13 |
고급 Linux 커맨드 마스터 가이드 (0) | 2009.06.23 |
Linux find 명령어 완전 정복 가이드 (0) | 2009.06.18 |
klogin과 rlogin (0) | 2009.06.08 |