BLOG main image
Their Finest Hour! Since1999..

카테고리

분류 전체보기 (934)
My Page (47)
Linux/Unix (604)
Windows (219)
Database (61)
Programming (1)
Network (0)
ScreenShot (1)
Tip (1)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백


Solaris 시스템 부하 측정



1. 용량 확인

1.1 Sun O/S 일 경우
# df

1.2 Solaris일 경우
# df -k
(참고)만약 root filesystem이 90% 이상일 경우 홈페이지에있는 find 명령어 사용법을 참조하여
비정상적으로 생성된 file을 삭제하라. 그리고 root filesystem에 user의 directory가 있는지
살펴 보아라. 특히 backup 시 device 명을 잘못 주어서 file로 저장되어서 시스템이 full 되는
경우가 많음

(참고) Find 명령어 사용법
1. /usr에 50,000 characters보다 큰 화일 찾아라.
# find /usr -type f -size +50000c -print
2. core file을 삭제하라.
# find / -name core -type f -exec rm {} \;
3. /usr/src에서 이름이 mem*.c인것을 찾아라.
# find /usr/src -type f -name "mem*.c" -print
4. owner가 root이고 set-user-ID를 가지는 모든 화일을 찾아라.
# find / -perm -04000 -user root -type f -exec ls -l {} \;
5. 최근 이틀내에 쓰여진 화일을 찾아라.
# find /usr -ctime -2 -print
6. 최근 이틀내에 쓰여지고 크기가 10,000byte이상인 화일이나 디렉토리를 찾아라.
# find /usr -ctime -2 -size +10000c -exec ls -l {} \;


2. CPU 용량 check

2.1 MP Control and Monitoring

* Processor control and information
* psrinfo - 사용가능한 CPU를 보여준다.
# psrinfo
0 on-line since 09/05/97 10:49:27
2 on-line since 09/05/97 10:49:31
* psradm - Enable or disable CPUs
# psradm -f 2 -> 2번 CPU를 off-line
# psrinfo
0 on-line since 09/05/97 11:16:04
2 off-line since 09/05/97 11:18:34
# psradm -n -a -> 모든 process를 on-line

2.2 CPU Rules for the SOlaris 2.x Operating Environment

# vmstat 30 or mpstat 30
condition Conclusion
0 == r CPU idle
0 < r / ncpus < 3.0 No problem
3.0 <= r / ncpus <= 5 CPU busy
5.0 <= r /ncpus CPU very busy
smtx < 200 No problem
200 <= smtx < 400 Mutex stall
400 <= smtx Mutex stall

# psrinfo | grep -c on (CPU 의 개수)


3. Swap space check

# vmstat 30
Condition Conclusion
100,000K <= swap Swap waste
10,000K <= swap < 100,000K No problem
4,000K <= swap < 10,000K Swap low
1,000K <= swap < 4,000K Swap very low
swap < 1,000K No swap

Action to Take
* Swap Low - 실행되는 프로그램 수를 줄이고, swap space를 늘려라.
* No Swap - 프로그램이 멈출 것이다. 즉시 swap space를 늘려라.

(참고) Swap space 를 늘리려면
1. Sun O/S 4.x 일경우
# mkfile 40m /user/swap  (40mb size)
# swapon /user/swap
# pstat -T    (swap size 확인)
# vi /etc/fstab
/usr/swap   swap   swap   rw 0  0
- swap file 삭제
# rm /user/swap
# vi /etc/fstab - add한 entry 를 삭제  

2. Solaris 2.x 일 경우
# /usr/sbin/mkfile 40m /user/swapfile 
# swap -a /user/swapfile (O/S에 swap file을 추가함) 
# swap -l 
# vi /etc/vfstab 
/user/swapfile - - swap - no - ( 이라인을 추가)
# swap -s
total : 5828kbytes allocated + 2456k reserved = 8284k used, 103792k available
(allocated : 현재 사용, reserved : kernel이 잡아놓음 , available : 사용할수 있는양)
# swap -d /user/swapfile (swap add한 file을 삭제)
          . 

4. Memory 용량 check

# vmstat 30
Condition Conclusion
sr == 0 RAM waste
0 < sr < 200 No problem
200 <= sr < 300 Low RAM
300 <= sr Very low RAM

* Low RAM - 메모리를 증설해야한다.


5. Disk 부하 check

# iostat -x 30
* svc_t (avque + avwait) : disk 응답시간
* 10 - 50 acceptable
* 100 - 1500 not acceptable
* %b : 디스크를 얼마나 많이 쓰는가?
* 5% 이하는 무시
* 60% 이상이면 조정할 필요가있다.


6. Network 부하 Check

# netstat -i 30
Condition Conclusion
(0 (0 (10<=output packets)&&(0.5%<=100*output colls/output packets <2.0%) No problem
(10 <= output packets)&&(2.0%<=100*output colls/output packets<5.0%) Busy network
(10<=output packets)&&(5.0%<=100*output colls/output packets) Very Busy Net
network type is not ie,le,ne or qe;it is bf or nf Not Ethernet

* Busy Network - 네트웍에 너무나 많은 충돌이 생겨서 사용자들이 응답을 기다리는 늘어나 고 throughput이
감소한다. 만약 다른 네트웍이 있다면 부하를 주는 것을 부하가없는 네트웍 으로 옮겨라. 또는 ATM 이나
100-MB Ethernet, FDDI같은 빠른 네트웍으로 upgrade하라.


7. System error messages check

# vi /var/adm/messages
# cd /var/adm
# grep panic *
# grep error *
# grep warning *


8. system 정보 출력

# /usr/platform/'uname -i'/sbin/prtdiag (this show usefull hardware information and failures of system)
# /etc/prtvtoc (show the detail information of disk slice ex) prtvtoc /dev/dsk/c0t0d0s2)
# /usr/sbin/eeprom (user can set some of variables of NVRAM via this command ex) eeprom boot-device=disk3)
# /usr/sbin/prtconf -vp ( Shows device configuration )
# devinfo -vp (Shows device configuration for Solaris 1.x)
# /usr/sbin/sysdef ( Shows software configuration )
# /usr/bin/dmesg | more ( collect system diagnostic messages to form error log
# /usr/proc/bin/ptree (Process trees that contain the process)
# /usr/proc/bin/pwdx pid ( Current working directory for a process)
# /usr/proc/bin/pldd pid ( Dynamic libraries linked into a process)
# /usr/proc/bin/pmap pid ( Address space map)


9. Performance gathering script

date >> /sunsolv/hangdata/vmstat.out
vmstat 30 10 >> /sunsolv/hangdata/vmstat.out
date >> /sunsolv/hangdata/iostat.out
iostat -xtc 30 10 >> /sunsolv/hangdata/iostat.out
date >> /sunsolv/hangdata/ps.out
/usr/ucb/ps -aux >> /sunsolv/hangdata/ps.out
date >> /sunsolv/hangdata/kmstat.out
echo kmastat | crash >> /sunsolv/hangdata/kmstat.out
date >> /sunsolv/hangdata/kernelmap.out
echo "map kernelmap" | crash >> /sunsolv/hangdata/kernelmap.out

위 명령어를 매 15분 마다 실행 하도록 crontab에 등록해놓는다.
Posted by 채종윤
CD-ROM으로 부팅하셔서 하드디스크의 /etc/shadow 파일의 비밀번호부분을
지우시면 됩니다. / 파티션이 /dev/dsk/c0t0d0s0인경우에 아래와 같은
작업을 하시면 됩니다.

ok boot cdrom -s
..
# mount /dev/dsk/c0t0d0s0 /mnt
# TERM=sun;export TERM
# vi /mnt/etc/shadow
# sync; reboot
Posted by 채종윤
1. 정규식에 대한 이해

grep,awk,sed,vi,perl등과 같은 명령어들을 패터처리 언어에서 사용하는 패턴에 대한 특정 규칙을 정규식(Regular Expression)이라고 부른다. 다시 말해서 패턴이란 "규칙적으로 기술된 문자열" 이라고 설명 할 수 있고 이런 규칙들을 표현하는 형식중의 한 방법이 정규식이다.

다음은 샘플 데이터 파일과 egrep 명령을 이용하여 정규식을 하나씩 설명하겠다.



<샘플 파일>
$ cat sampfile
This is sample data file
Hello This is Kim.
I'm so happy
Test100
test200
Are you unhappy ?



1) " ^ " : 행의 시작과 부합

$ grep "^H" sampfile
Hello This is Kim.



2) " $ " : 행의 끝과 부합

$ grep "happy$" sampfile
I'm so happy



3) " * " : 임의의 0개 이상의 문자와 부합

$ egrep "e*" sampfile
This is sample data file
Hello This is Kim.
I'm so happy
Test100
test200
Are you unhappy ?
$ egrep "ee*" samplefile
This is sample data file
Hello This is Kim.
Test100
test200
Are you unhappy ?
$ egrep "ppp*" sampfile
I'm so happy
Are you unhappy ?



4) " ? " : 임의의 0 또는 1개의 문자와 부합

$ egrep "pp?" sampfile
This is sample data file
I'm so happy
Are you unhappy ?



5) " + " : 임의의 1개 이상 문자와 부합

$ egrep "pp+" sampfile
I'm so happy
Are you unhappy ?



6) " . " : 임의의 한문자와 부합

$ egrep "y.." sampfile
Are you unhappy ?



7) " \< " : 단어의 시작과 부합

" \> " : 단어의 끝과 부합
$ egrep "happy" samplfile
I'm so happy
Are you unhappy ?
$ egrep "\" sampfile
I'm so happy
$ egrep "happy\>" sampfile
I'm so happy
Are you unhappy ?





8) " [문자들] " : 문자들에 포함되는 하나의 문자와 부합

" ^[문자들] " : 문자들에 포함되는 문자들을 제외한 하나의 문자와 부합
$ egrep "^[A-Z]" sampfile
test200
$ egrep "^[^A-Z]" sampfile
This is sample data file
Hello This is Kim.
I'm so happy
Test100
Are you unhappy ?
$ egrep "[0-9]$" sampfile
Test100
test200



9) 정규식과 부합하는 문자의 반복횟수

\{숫자\} : 정확히 지정된 숫자만큼 반복
\{최소값,최대값\}: 최소값부터 최대값까지 횟수 만큼 반복
ex) a\{1\} a가 정확히 한번 team , happy, goal
a\{1,\} a가 한번이상 반복 team. aang, aaaang
a\{2,5\} a가 2번이상 5번 이하 반복 aa, aaa, aaaa, aaaaa



10) " \( 패턴 \) " : 내부 표현식을 만든다.

패턴을 하나의 문자 처럼 사용한다.
" \숫자 " : 숫자번째 내부 표현식에 부합된 문자열을 다시 참조한다.
$ egrep '\([A-Za-z0-9].*\)\(:.*\)\{4\}:/export/home/\1:' /etc/passwd
결과> /etc/passwd 파일안에서 사용자의 login명과 기본 디렉토리명이 같은 사용자를 검색하여 출력한다.



11) " \ " : 정규식의 메타 문자가 아닌 문자 자체로 해석

$ egrep "\.$" sampfile
Hello This is Kim.



2. awk

awk 은 설계자인 Aho, Weingrger, Kernighan의 첫글자로 명명되어진 패턴검색과 처리 기능을 가진 인터프리티드 프로그래밍 언어로서 필터링, 치환, 간단한 리포팅 작업을 제어할수 있다.



1) "awk" 형식

awk 프로그램은 세부분으로 구성되어 진다.

BEGIN Section : 파일을 읽기전에 실행
Pattern Statment Section : 파일의 각 레코드 라인을 읽어들일 때 마다 실행
END Section : 파일을 다 읽어들인 뒤 실행

BEGIN { statements ….}
/pattern expression / { statements .... }
END { statements… }


여러개의 statement를 한 라인에 쓸때는 statement ; statement 의 형식으로 기술한다.



2) awk 명령어 실행 방법



"awk" 프로그램을 명령어 상에서 입력하는 경우
$ awk '{print $0 }' datafile ....
단일인용문( ' ' ) 안에 프로그램을 기술한다. 데이터 파일을 정의하지 않으면 표준 입력으로부터 데이터를 입력 받는다.

awk 프로그램을 파일로 작성하는 경우는
$ awk -f awk-program-filename data-filenames

ex)
$ awk ' BEGIN { print "awk 프로그램 실행 연습입니다" } '
$
$ awk '{ print $1, $2 } ' data1
100 200
300 400
500 600
$
$ cat ex01
# This is sample file
BEGIN {
print "Hello, I'm Kim "
exit }
$
$ awk -f ex01
Hello, I'm Kim

$



3) 레코드

레코드는 입력된 파일의 한 줄을 말한다. 라인 전체의 내용은 $0 변수명으로 사용되며, 입력된 레코드 번호는 NR 이라는 변수로 표시 된다.

4) 필드

입력된 레코드에서 스페이스 또는 탭으로 구분되는 문자들을 말한다. 각각의 필드는 $1,$2,$3,....$n 으로 필드위치에 따라 변수명으로 표기되며 현재 필드값은 NF 변수로 표시된다.

5) 변수

위치변수 는 필드 또는 레코드를 나타낸다.
$0 : 현재 입력된 레코드를 나타내는 변수
$1 : 현재 입력된 레코드의 첫 번째 필드를 나타내는 변수
$n : 현재 입력된 레코드의 n번째 필드를 나타내는 변수

재정의 변수는 입력된 레코드의 구성과 크기에 대한 정보를 제공한다.
NR : 레코드 수
NF : 필드 수
FS : 필드 구분 문자
RR : 레코드 구분 문자
OFS : 출력 필드 구분 문자
ORS : 출력 레코드 구분 문자
FILENAME : 현재 입력된 파일 이름
OFMT : 출력 인쇄 형식

사용자 정의 변수는 프로그램의 어느 곳에서도 사용자가 정의하여 사용 할 수 있으며, 숫자 또는 문자열 값을 가진다. 초기화 하지 않으면 자동적으로 null(0) 문자를 가진다.

ex)
$ cat data1
100 200
300 400
500 600
$ cat ex02
BEGIN { OFS="------" }
{ print $1,$2 }
$
$ awk -f ex02 data1
100------200
300------400
500------600
$
$ cat ex03
{ x = $1 + $2
y = y + x }
END { print y }
$
$ awk -f ex03 data1
1600
$



6) 패턴 과 연산자



패턴의 형식은 egrep과 유사한 형식을 가진다. 정규식을 사용하여 패턴을 구성할 수 있으며 패턴은 "/ /" 형식으로 지정한다.
"/ /,/ /" 형식을 사용하여 패턴으로 범위를 지정할 수 있다.

ex)

$ cat ex04
$2 ~ /^[0-9]+$/ { print $2 }
-> 두 번째 필드가 숫자로만 구성되어 있으면 두 번째 필드값을 출력
$ awk -f ex04 data1
200
400
600
$
$ cat ex05
$0 ~ /[Ee]nd/ { print "end of", FILENAME }
$
-> 읽어 들인 레코드의 값이 End 또는 end이면 "end of data1" 과 같은 형식으로 출력
$ cat ex05_1
/Begin/,/End/ { total += $1 }
END { print "Total = " total }

연산자는 관계연산자, 패턴 연산자, 산술연산자, 지정 연산자, 복합지정연산자, 증감연산자 가 있다.
관계연산자는 숫자 또는 스트링 값을 비교할 때 사용한다.

== 같다
!= 같지 않다
> 크다
< 작다
>= 크거나 같다
<= 작거나 같다

ex)

NF != 5 { print "필드수가 5개가 아님"}
$1 >= 10000 { print "첫번째 필드값이 10000 보다 크거나 같다" }
$1 >= "s" { print " 첫 번째 필드가 s 보다 뒷문자(tuvw..)이다"}
$1 < $2 { print "두번째 필드 값이 첫 번째 필드 값보다 크다"}



패턴연산자는 스트링 패턴과의 일치 여부를 비교할 때 주로 사용 된다.

~ 패턴과 일치
!~ 패턴과 같지 않다.



ex)
$1 !~ /^[0-9]+$/ { print "첫번째 필드가 숫자가 안니다" }
$2 ~ /korea/ { print "두번째 필드값이 korea 이다"}



산술연산자는 수식 계산에 사용된다
+ 더하기
- 빼기
* 곱하기
/ 나누기
% 나누어서 남은 나머지



지정 연산자는 오른쪽 값을 왼쪽 변수에 대입한다
= 지정연산
ex) a = 10



복합 지정 연산자는 산술연산자와 지정연산자를 결합해서 사용한다
+= , -=, *=, /=, %=

ex) a += 5 : a = a + 5 와 같은 문장이다.

증감 연산자는 값을 1씩 증가하거나 감소 시킬 때 사용한다

++ 1 증가
-- 1 감소

ex)
$ cat ex06
END { a = 0
print "a++ = ", a++
print "a-- = ", a--
exit
}

$ cat ex07
BEGIN { a = 0 }
$1 > 100 { a++ }
END { print "첫번째 필드의 값이 100보다 큰 경우는 ", a, "번입니다" }
$

$ awk -f ex07 data1
첫번째 필드의 값이 100보다 큰 경우는 2 번입니다



7) 출력문

print 문은 출력하고자하는 문자열은 "출력내용" 의 형식으로, 변수값은 변수명을 사용하여 출력한다.
" , " (쉼표)는 "print"문 안에서 필드를 구분한다. "" 사이의 문자열은 하나의 필드로 취급된다.
출력방향을 조정하기위해 " > " 문자와 " >> " 문자를 사용할수 있다. 출력될 파일이름은 인용부호("")안에서 사용한다.

ex)
$ cat ex08
{ print $1,$2 > "sample"}
$
$ awk -f ex08 data1
$ cat sample
100 200
300 400
500 600

"printf" 문을 사용하여 출력 양식을 지정할 수 있다.
사용형식은 printf "format",expression1, expression2,..... 이다.
format에서 변환사양은 % 기호를 붙여서 표시한다

%d 십진수
%o 8진수
%x 16진수
%s 문자열
%f 소수
%e 지수를 사용한 소수
%g %f,%e중 짧은 형태의 출력을 사용한다.

ex)
$ cat ex09
$1 ~ /^[0-9]+$/ { printf "첫번째 필드 값은 %d 입니다\n",$1 }
$
$ awk -f ex09 data1
첫번째 필드 값은 100 입니다
첫번째 필드 값은 300 입니다
첫번째 필드 값은 500 입니다
$



파이프(|)를 사용하여 " print"문의 출력을 UNIX 시스템 명령어의 입력으로 사용할 수 있다. awk 안에서 유닉스 명령과 인수를 사용하는 경우는 인용부호(" ")로 묶어서 사용한다.

$ cat ex09
END { print " Pipe Test ...Is it OK? " | "mail guest" }
$
$ awk -f ex08 data1
$ login guest
Welcome to guest account
You have mail



8) 프로그래밍 언어 구조 제어문들



" if " 문

ex)
{ if ( $1 < 100 && $2 > $3 )
{ print "첫번째 필드값이 100보다 작고 두 번째 필드값이 세 번째 필드값 보다 큽니다" }
}

ex)
{ if ( $1 > 100 || $2 >100 )
{ print "첫번째 필드값이 100보다 크거나 두 번째 필드값이 100보다 큽니다" }
}



" while " 문

{ i = 1
while ( i <= NF )
{ print "필드수가 1개보다 작거나 같습니다" }
}



" for " 문

ex)
$ cat ex10
{ for ( a = 1 ; a <= NF ; a++ ) print NR,a ,$a }
$ awk -f ex10 data1
1 1 100
1 2 200
2 1 300
2 2 400
3 1 500
3 2 600
$



" break "문은 순환문의 수행을 중지 시키고 순환문 밖의 문장을 수행한다


" continue "문은 순환문의 수행을 중지하고, 순환문의 처음 조건을 테스트한다.


" next " 문은 다음 입력 레코드를 읽어 들이고 프로그램 수행은 패턴문의 처음을 수행한다.


" exit " 문은 프로그램 실행을 종료한다



ex)
$ cat ex11
{ for ( n = 1; ; n++ )
{ if ( n <= NF ) { print NR, n, $n
continue }
break
} }
$
$ cat ex12
NF > 2 { print NR, NF; next }
$
$ cat ex13
$1 > 100 { print NR, " $2= ", $2, "$2값 오류"
exit 99 }
$



9) awk에서 많이 사용되는 함수들



" length " 함수는 주어진 문자열의 문자 개수를 반환한다. length 함수에 인수가 없으면 현재 입력 레코드의 문자수를 반환한다.

$ cat ex14
{ print NR, "입력된 문자열의 문자수는 " , length, "개입니다" }
$

$ cat ex15
{ print NR, "첫번째 필드의 문자수는 ", length($1), "개입니다" }
$



" substr " 함수는 지정한 문자열에서 원하는 개수 만큼의 문자들을 추출하여 반환한다

$ cat ex16
BEGIN {
print substr("Happy Birthday",7,9)
exit }

$ awk -f ex16
Birthday



" index " 함수는 문자열에서 지정하는 문자열이 있는 위치를 나타낸다. 문자열에서 지정한 문자열이 포함되어 있지 않은 경우는 0 값을 반환한다.

$ cat ex17
BEGIN {
print index("Hello This is Kim","This")
exit
}

$ awk -f ex17
7
$



" sprintf " 함수는 printf함수와 사용방법이 유사하지만 출력의 방향이 지정연산자의 왼편에 있는 변수명이다.

$ cat ex18
{ var = sprintf("출력연습 : 첫 번째 필드 : %d ",$1)
print var
}
$

$ awk -f ex17 data1
100
300
500
$



3. sed



sed는 stream editor의 약어이며 문자를 스트림으로 나타나는 입력을 수정하거나 편집하는데 사용되는 툴입니다. 유닉스에서 제공하는 다른 편집기와의 차이점은 원본 파일을 변경시키지 않고 명령이 실행 되는 필터 기능을 가지고 있는 것입니다. 그래서 변경된 내용을 보존하기 위해서는 적절한 조치가 필요합니다.

1) "sed" 명령어 실행 형식

sed [-n][-e edit_command][-f command_file][ input_data_files ..]



옵션:
-n 결과행의 출력을 하지 않는다
-e 편집할 명령을 기술한다. 각각의 편집 명령마다 이 옵션을 붙인다
-f 편집할 명령을 파일로 작성한 뒤 파일에서 읽어서 명령을 실행한다
input_data_file 입력을 지정하지 않으면 표준입력으로부터 입력을 읽어 들인다.



사용 형식 예제:

$ sed -e 'sed_command' -e 'sed_command' .... filenames
$ sed -f sed_script_file filenames
$ cat datafile
Hello this is kim.
I'm so happy to meet you.
Test sample
sample program
Java programming



2) 라인 선택 출력과 파일로 출력



라인을 선택하여 출력할때는 -n 옵션과 sed명령중 p 명령을 이용하여 구현할 수 있다.

$ sed -n '1,3p' datafile <-- 1번-3번라인까지 출력한다.
Hello this is kim.
I'm so happy to meet you.
Test sample
$ sed -n '/^s/p' datafile
sample program : 라인의 시작이 's'인 라인을 출력
$ sed '/^s/p' datafile
Hello this is kim.
I'm so happy to meet you.
Test sample
sample program
Java programming

$ sed -e '/^sample/w sam_file' datafile
$ cat sam_file

sample program



3) 삭제, 추가, 삽입, 치환



삭제예:
$ sed '1,3d 'datafile
sample program
Java programming
$ sed '/^sample/,/^Java/d' datafile : 라인중 sample로 시작하는 라인 부터 Java로 시작하는 라인 까지 삭제
Hello this is kim.
I'm so happy to meet you.
Test sample



추가예:
$ cat file1 : 각 라인의 아래에 '=====' 라인이 추가된다

a\
=====
$ sed -f file1 datafile
Hello this is kim.
=====
I'm so happy to meet you.
=====
Test sample
=====
sample program
=====
Java programming
=====



삽입예: : 각 라인 위에 '***' 라인이 추가된다
$ cat file2
i\
***
$ sed -f sed_script_file filenames
***
Hello this is kim.
***
I'm so happy to meet you.
***
Test sample
***
sample program
***
Java programming



치환예:
$ sed -n '1,3s/t/T/gp' datafile :변경된 라인만 출력
Hello This is kim.
I'm so happy To meet you.
TesT sample

$ sed '1,3s/t/T/g' datafile :모든라인을 모두 출력
Hello This is kim.
I'm so happy To meet you.
TesT sample sample program
Java programming

$ sed -n '1,3s/t/T/gw sam_file2' datafile : 변경된 라인만 sam_file2 파일에 저장 한다
$ cat sam_file2
Hello this is kim.
I'm so happy To meet you.
TesT sample

$ sed 's/\/export\/home/\home3/g']

'/' 문자는 '\'문자를 사용하여 표시한다.
/export/home is user01's base directory <-- 입력라인
/home3 is user01's base directory <- 출력라인
Posted by 채종윤

Total : Today : Yesterday :
채종윤's Blog is powered by Daum & Tattertools.com / Designed by tistory.com