xmanager 설정 [linux]

OS/Linux 2008.06.25 21:23 |
Linux Xmanager 연결 방법!

2. XDMCP connection fails for Linux. How do I configure my Linux box?
How to configure Linux XDMCP(KDE/GNOME) settings for Xmanager
Affected Files
For runlevel: /etc/inittab
For GDM: /etc/X11/gdm/gdm.conf
For KDM: /etc/X11/xdm/xdm-config
/etc/X11/xdm/Xaccess
/etc/X11/xdm/kdmrc
/usr/share/kdm/kdmrc
/usr/share/config/kdm/kdmrc
/etc/opt/kde2/share/config/kdm/kdmrc
For Firewall: /etc/sysconfig/ipchains
Step 1. Change runlevel to enable gdm or kdm.
1. Open /etc/inittab file.
2. Change the runlevel to 5 as following:

id:5:initdefault:
Step 2. GDM configuration (When the Linux is using gdm)
1. Open /etc/X11/gdm/gdm.conf file.
2. Go to the [xdmcp]section.
3. Set the value of "Enable" option to "1".
Step 3. KDM configuration (When the Linux is using kdm)
1. Open /etc/X11/xdm/xdm-config file.
2. Comment out "requestPort" option as following:
DisplayManager.requestPort: 0
==>
!DisplayManager.requestPort: 0
3. Open /etc/X11/xdm/Xaccess file.
4. Remove the initial "#" character for the following line:
#* #any host can get a login window
==>
* #any host can get a login window
5. Open /etc/X11/xdm/kdmrc,
/usr/share/config/kdm/kdmrc or
/etc/opt/kde2/share/config/kdm/kdmrc file.
6. Change the value of "Enable" option to "true".

위 처럼 kdm, gdm 확인후 설정 부분을 약간씩 수정하면 됩니다.
신고



댓글을 달아 주세요

r계열 명령어 사용법
RHEL 기반 리눅스에서의 r계열 명령어의 사용법에 대한 간략한 메뉴얼입니다.


간략하게 r계열 명령어의 사용에 대해서 정리해보도록 하지요.

1. 패키지가 설치되어 있는지 확인

# rpm -qa | grep rsh

위 명령어로 rsh 과  rsh-server 패키지가 설치되어 있는지 확인합니다.

기타 다른 r관련 명령어와 관련된 패키지로는 rusers, rusers-server, rwho등이
있으니 관리상 필요하시면 추가 설치하시면 됩니다.


2. xinetd 설정 확인

/etc/xinetd.d/ 디렉토리 밑에 r로 시작하는 명령어(rexec, rlogin, rsh, rsync)
등의 명령어에 대한 설정이 있을 것입니다.

각각의 파일의 disable = yes 라고 되어있는 부분을  disable = no 로 변경해 주시기 바랍니다.
(rcp의 사용을 위해서는 rsh파일만 수정해주면 되긴 합니다만 여타 다른 r명령어의
사용을 원하신다면 상기 파일 모두를 수정해주시면 됩니다.)


3. xinetd 재시작

/etc/init.d/xinetd restart

위 명령어로 xinetd 를 재시작하여 설정 변경내용을 적용합니다.


4. 확인작업

ntsysv --level 345

위 명령어를 통하여 런레벨 3,4,5번의 r 관련 명령어 항목이 제대로 설정되어 있는지 확인합니다.
혹시나 빠진것이 있다면 그 곳에서 체크표시를 하여 제대로 데몬이 동작하도록 하면 됩니다.
물론 변경 이후에는 xinetd를 재시작하여 설정 변경내용을 적용해주셔야 합니다.
(2번 작업을 생략하고 이곳에서 r계열 명령어의 서비스 기능을 활성화해주셔도 됩니다.)

5. .rhosts 파일 설정

사용하려는 id계정 홈 디렉토리 밑에 .rhosts 파일을 작성해줍니다.

# cat .rhosts

localhost
testserver1
testserver2
192.168.0.20

이런식으로 접속 가능하도록 하려는 호스트명 혹은 ip를 모두 적어주면 됩니다.
물론 .rhosts 파일은 파일 소유자의 권한으로 작성하셔야겠지요.

혹은 다른 방법으로 /etc/hosts.equiv 라는 파일을 하나 생성하는 방법도 있습니다.

# cat /etc/hosts.equiv

localhost    foo bar
testserver    scott tiger
192.168.0.20   root test hello world

이런식으로 맨 앞에 호스트명을 기재해주시고 뒤에 기재한 호스트에서 접속을
허용하려는 id들을 나열해주시면 됩니다.

둘중 편한 방법을 사용하시면 될 것입니다.

이후 보안을 위해서, 그리고 실제로 그냥 생성해서 그대로 사용시 에러가
발생하므로 .rhosts 혹은 /etc/hosts.equiv 파일의 group과 other의 쓰기 권한을 제거합니다.

# chomd go-w /etc/hosts.equiv
혹은
# chmod go-w ~/.rhosts


6. /etc/hosts 파일 설정

사용하려는 호스트들을 모두 /etc/hosts 파일에 넣어줍니다.
이 부분의 설정을 적용하지 않을 시 제대로 호스트명을 가져오지 못하는 경우가
발생하여 실질적으로 ip로 접속할 수 밖에 없게 됩니다.

# cat /etc/hosts

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1               localhost.localdomain localhost
192.168.0.1           testserver-1
192.168.0.2           testserver-2
192.168.0.3           testserver-3
192.168.0.4           testserver-4


7. root 사용자 r명령어 허용 필요시

root 로그인을 허용하기 위해서 /etc/securetty 라는 파일을 수정합니다.

# cat /etc/securettyconsole

vc/1
vc/2
vc/3
vc/4
vc/5
vc/6
vc/7
vc/8
vc/9
vc/10
vc/11
tty1
tty2
tty3
tty4
tty5
tty6
tty7
tty8
tty9
tty10
tty11
rsh
rlogin

제일 밑에 rsh과 rlogin을 추가해주시면 됩니다.
필요하다면 rcp등도 추가 가능하겠지요.

그리고 기본적으로
/root/.rhosts 파일은 생성해주셔야겠지요.

또한 /etc/pam.d/rsh 와 /etc/pam.d/rlogin을 열어서
pam_securetty.so 에 해당되는 줄을 주석처리해주어야 합니다.
보안을 위하여 root의 rsh 서비스를 막아둔것을 푸는 것입니다.




8. rcp 명령어 보안설정 해제

버전에 따라 다르긴 합니다만 rcp명령어를 사용시에 permission denied 에러가
발생하는 경우가 있을것입니다.

/etc/pam.d/rsh 파일에서 항목 하나를 주석처리 해줍니다.


# cat /etc/pam.d/rsh

#%PAM-1.0
# For root login to succeed here with pam_securetty, "rsh" must be
# listed in /etc/securetty.
auth       required     pam_nologin.so
# auth       required     pam_securetty.so      <- root 보안설정을 위해 주석처리해준것
auth       required     pam_env.so
# auth       required   pam_rhosts_auth.so    <- rcp작업시에 생기는 문제 해결
account    required     pam_stack.so service=system-auth
session    required     pam_stack.so service=system-auth

9. rcp 명령어 사용법
혹시 몰라서 내용 추가합니다.

rcp 사용방법은 다음과 같습니다.

rcp [-r] Source Destination

-r 옵션은 복사할 내용이 파일이 아닌 디렉토리일때 이용합니다.

예를 들면 다음과 같습니다.

ex1> rcp 192.168.0.10:/etc/hosts /etc/hosts
ex2> rcp foo:/tmp/what bar:/tmp/hello

신고



댓글을 달아 주세요

사용하는 서버의 /etc/crontab 에 아래와 같은 줄이 있습니다.

0 0 * * 1 root rdate -s time.kriss.re.kr && clock -w

그러니까 매주 한번씩 타임서버인 time.kriss.re.kr에서 시간을 읽어와서
rdate -s 옵션으로 저장하고(man rdate 참조), clock 명령으로
CMOS 시간값에 저장합니다.(man clock 참조).

타임서버는 가까이 있는 신뢰할만한 타임서비스 서버를 적으면 좋겠지요.

경험에 의하면 타임서버가 외국서버라 해도 시간대에 관계없이(타임서비스
자체가 시간대정보까지 포함하는가 보죠.) 잘 작동합니다.

*-- 몇몇 타임서버 -----------*

time.kriss.re.kr
time.bora.net
time.nuri.net
time-a.nist.gov


제가 아는바로는 rdate -s 명령이나 date -s명령은 궂이 구분을 짓자면
소프트웨어적인 시간을 설정하는 것으로 압니다.
따하서 하드웨어 시간(CMOS)까지 조정해줘야(clock -w) 리부팅후 조정시간이
반영되겠지요.

하두 오래전 일이라 매뉴얼페이지를 다 뒤져볼수는 없지만 어렴풋한 기억으론
위의 말이 맞을것 같습니다.

제 경우 1주일에 한번씩 재설정하고 있긴 하지만(제 보드도 TYAN 입니다.)
항상 몇초에서 몇분씩 틀리긴 하더군요.  어긋나는 시간을 최소화하자는 취지에서
매주 1회 돌리고 있답니다.

타임서버에서 자주 시간값을 읽어와 재설정하는것도 좋긴 하지만
간혹 cron이나 at등의 스케줄에 영향받는 프로그램을 고려해야할것입니다.

예컨대 이런 문제도 발생할 수 있겠지요.

10시 1분에 일일 자료백업을 하도록 cron에 설정해두고, 10시 정각에
타임서버에 접속하여 시간을 재설정했는데 타임서버의 시간이 10시 2분이었다고
치죠.
그렇다면 10시 1분은 그냥 지나친 결과이기 때문에 예정된 작업은 수행되지
않을겁니다.

아무튼 date 명령으로 출력된 시간을 하드웨어(CMOS)에 기록하기 위해서는
clock -w 명령을 사용하면 되고, 리부팅시 초기에 CMOS 시간을 참조할 것이므로
조정된 시간이 반영될테지요.


[lawwal@ ~]# echo;echo -n "System : "; date;echo -n "CMOS : ";clock -r;
echo -n "Time Server : "; rdate time.kriss.re.kr;echo

System : Tue Sep  7 10:50:44 KST 1999
CMOS : Tue Sep  7 10:50:57 1999  -0.562593 seconds
Time Server : [time.kriss.re.kr]   Tue Sep  7 10:50:55 1999


[lawwal@ ~]# rdate -s time.kriss.re.kr && clock -w


[lawwal@ ~]# echo;echo -n "System : "; date;echo -n "CMOS : ";clock -r;
echo -n "Time Server : "; rdate time.kriss.re.kr;echo

System : Tue Sep  7 10:53:33 KST 1999
CMOS : Tue Sep  7 10:53:34 1999  -0.171902 seconds
Time Server : [time.kriss.re.kr]   Tue Sep  7 10:53:33 1999

신고



댓글을 달아 주세요

솔라리스

$ mkfile -n 1g file1


dd if=/dev/zero of=/tmp/1megafile bs=1M count=1


와 같이 하면 /tmp/1megafile 이라는 1Megabytes 짜리 파일이 생성됩니다.


위 bs 파라미터와  count 를 조절하여 파일의 크기를 정할 수 있습니다.

신고



댓글을 달아 주세요

 iptraf

다운로드
RHEL4 64bit
wget http://download.rhn.redhat.com/download/1207551167/7f8f6766bcc1f5b4e7f4c01a75345938a37dde7e/5003621/0/rhn/public/NULL/iptraf/2.7.0-11/x86_64/iptraf-2.7.0-11.x86_64.rpm

RHEL4 32bit
wget http://download.rhn.redhat.com/download/1207555087/1d720d27b05ebba9179b3b42f6991d37893d882b/5003621/0/rhn/public/NULL/iptraf/2.7.0-11/i386/iptraf-2.7.0-11.i386.rpm

rpm -Uvh 패키지


iptraf 로 확인

신고



댓글을 달아 주세요

port open - server

OS/Linux 2008.06.25 20:35 |

결론적으로 원하시는 상태, 즉 접속가능한 상태를 표시하고 싶다면,
먼저 /etc/service 에서 원하는 포트를 열어두신후에
프로그램으로 원하는 소켓의포트를 오픈하는서버데몬을 작성하신후에
클라이언트에서 그포트를 이용하기위해접속하면 됩니다

먼저 원하시는 상태에 대한 설명이 필요할것 같습니다

tsc14:~ # netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 0.0.0.0:11              0.0.0.0:*               LISTEN      6023/xinetd        
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1908/portmap       
tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN      6023/xinetd        
tcp        0      0 0.0.0.0:631             0.0.0.0:*               LISTEN      2505/cupsd         
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2837/master        
tcp        0      0 :::22                   :::*                    LISTEN      2250/sshd          
tcp        0      0 ::1:25                  :::*                    LISTEN      2837/master        
tcp        0    220 210.183.235.14:22       210.183.235.13:2421     ESTABLISHED 4411/38

이처럼 netstat 를 하였을때 ESTABLISHED 상태로 나오는것은
서로 연결된 상태를 이야기합니다
 

Netstat 명령어 사용법

tsc14:~ # netstat --help
usage: netstat [-veenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}
       netstat [-vnNcaeol] [<Socket> ...]
       netstat { [-veenNac] -i | [-cnNe] -M | -s }

        -r, --route              display routing table
        -i, --interfaces         display interface table
        -g, --groups             display multicast group memberships
        -s, --statistics         display networking statistics (like SNMP)
        -M, --masquerade         display masqueraded connections

        -v, --verbose            be verbose
        -n, --numeric            don't resolve names
        --numeric-hosts          don't resolve host names
        --numeric-ports          don't resolve port names
        --numeric-users          don't resolve user names
        -N, --symbolic           resolve hardware names
        -e, --extend             display other/more information
        -p, --programs           display PID/Program name for sockets
        -c, --continuous         continuous listing

        -l, --listening          display listening server sockets
        -a, --all, --listening   display all sockets (default: connected)
        -o, --timers             display timers
        -F, --fib                display Forwarding Information Base (default)
        -C, --cache              display routing cache instead of FIB

그리고 상태표시에 대한 설명입니다

State

내       용

LISTEN

서버의 데몬이 떠서 접속 요청을 기다리는 상태.

SYS-SENT

로컬의 클라이언트 어플리케이션이 원격 호스트에 연결을 요청한 상태

SYN_RECEIVED

서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게 응답을 하였지만 아직 클라이언트에게 확인 메시지는 받지 않은 상태.

ESTABLISHED

3 Way-Handshaking 이 완료된 후 서로 연결된 상태

FIN-WAIT1
CLOSE-WAIT
FIN-WAIT2

버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아 종료하는 과정의 상태.

CLOSING

흔하지 않지만 주로 확인 메시지가 전송도중 분실된 상태

TIME-WAIT

연결은 종료되었지만 분실되었을지 모를 느린 세그먼트를 위해 당분간 소켓을 열어놓은 상태.

CLOSED

완전히 종료.

신고



댓글을 달아 주세요

이런 경우는 대부분 2가지 입니다.

1. df는 dirty buffer 에 있는 용량을 계산 하지만, du 는 계산하지 않는 경우..

이 경우는 sync 명령으로 해결이 가능 합니다. 다른 경우는

2. file description 이 open 된 상태에서 file 에 remove 되었을 경우

이 경우는 리부팅을 해야지 처리가 됩니다. 예를 들어 apache 작동중에 log 파일이 크다고, 그냥 삭제했을 경우.. 많이 발생합니다. 로그 파일은 해당 file description 을 열고 있는 process 를 죽이신 다음 삭제하셔야 합니다. :-) 뭐 로그가 많이 쌓이지 않는다면 무시할 수도 있겠지만요. 요즘 dist 가 크니..

신고



댓글을 달아 주세요

이번 시리즈의제 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
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)
여기에서는 파일네임만이 관심 사항이기 때문에 다음 커맨드 cut -d":" -f1을 실행하여 첫 번째 필드만 표시되도록 합니다.
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
wc -l 
            0
$
"SSSSSS" 문자열의 검색 결과 매치가 반환되지 않았습니다. 따라서 xargs에는 아무런 입력도 전달되지 않습니다(-t 옵션을 이용해서 이를 확인할 수 있습니다). 경우에 따라서는 처리할 대상이 존재하지 않는 경우 xargs의 실행을 중단해야 할 수도 있습니다. 이를 위해 사용되는 것이 -r 옵션입니다.
$ 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. 확장자로 변경하도록 지시하고 있습니다. 따라서 sqlnet.log 파일은 sqlnet.log.2006-09-12-23:26:28과 같은 이름으로 변경됩니다.

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 > ? 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
$
위에서는 쉘에서 "sqlplus"로 시작하는 모든 프로그램을 검색한 후, 검색된 프로그램을 실행하도록 명령하고 있습니다. -ok와 {} 사이에 아무 것도 없기 때문에, 커맨드는 검색된 파일을 그저 실행하기만 합니다. 결과로 두 개의 파일(sqlplus와 sqlplusO)가 검색되었으며, 각 커맨드에 대해 실행 여부를 묻는 프롬프트가 뜹니다. 사용자는 "sqlplus"에 대한 프롬프트에서 "y"를 입력하여 커맨드를 실행하였습니다. 커맨드 실행이 완료되면 두 번째 파일(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

프로세스의 상태 정보로 다음과 같은 코드로 표시됨:
R – Running
S –Sleeping
Z – Zombie
T – Stopped

또는 다음과 같은 문자가 함께 표시될 수도 있음:
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로 변경되었음을 확인할 수 있습니다. c

신고



댓글을 달아 주세요

티스토리 툴바