태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
블로그 이미지
하늘을 헤엄치다. revoman

카테고리

분류 전체보기 (176)
Eye (13)
Programming (82)
Unix & Linux (52)
Android (3)
Tool and Tip (13)
시스템 관리 (7)
OPEN SOURCE (2)
XML (1)
WEB (0)
MY PROGRAM (1)
정보관리기술사 기출.. (1)
IT 동향 (1)
Total56,866
Today6
Yesterday34

gcc warning option

Programming/C / 2009/06/23 16:35

개발을 하면서 gcc 로 컴파일을 할때 -Wall -Werror 옵션을 켜는 경우가 있다.

 

이 경우, 불필요한 Warning에 대해서는 허용을 해줄 필요가 있는데 이럴때 사용하는 옵션이 -Wno- 옵션이다. 일반적으로 -W 옵션과 대응대며,

다음 Warning에대해서 error 처리를 하지 않기를 원하면, -Wno-flag를 추가하면 된다. (예. -Wno-implicit)

          -Waddress  
          -Warray-bounds (only with-O2)
          -Wc++0x-compat 
          -Wchar-subscripts 
          -Wimplicit-int 
          -Wimplicit-function-declaration 
          -Wcomment 
          -Wformat  
          -Wmain (only for C/ObjC and unless-ffreestanding)
          -Wmissing-braces 
          -Wnonnull 
          -Wparentheses 
          -Wpointer-sign 
          -Wreorder  
          -Wreturn-type 
          -Wsequence-point 
          -Wsign-compare (only in C++)
          -Wstrict-aliasing 
          -Wstrict-overflow=1 
          -Wswitch 
          -Wtrigraphs 
          -Wuninitialized 
          -Wunknown-pragmas 
          -Wunused-function 
          -Wunused-label    
          -Wunused-value    
          -Wunused-variable 
          -Wvolatile-register-var

 

그밖에도 몇가지 -Wno- 옵션들이 있으니 자세한 사항은 아래의 사이트를 참고하면 도움이 될 것이다.

참고 사이트 : http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Warning-Options.html#Warning-Options


Posted by revoman
TAG Linux, unix

원문 : http://kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/globbingref.html

 

 

들어 가는 글

정규 표현식이 emacs나 vi같은 에디터나 grep/egrep 과 awk, perl , sed 같은 프로그램에서 사용되는 것을 볼 수 있다..

정규 표현식은 향상된 문맥민감(context sensitive) 탐색이나 텍스트의 수정 등에서 사용된다. 정규 표현식은 텍스트의 문자열과 매치되는, 형식이 아주 잘 갖춰진 표현이다.

필자는 몇 년 전에 정규 표현식을 쓰는 사람을 보고서 정규 표현식에 빠져 들게 되었다. Text를 입력하는 일과 수정하는 일은 보통 많은 시간이 걸리게 되게 마련인데, 그 사람은 몇 초만에 일을 하고 말았다. 화면에 있는 표현식을 봤을 때 이해할 수는 없었다. 표현식은 점(.)과 슬래쉬(/)로 시작하고 몇몇 문자의 조합으로 이루어져 있었다. 그때부터 정규 표현식이 어떻게 돌아가는지 배우기 시작했고, 곧 정규 표현식이 어렵지 않다는 것을 알았다. 단순히 간단한 문법 규칙들로 이루어 졌다는 것을 알았다.

정규 표현식은 유닉스 환경에서 매우 많이 사용되고 있지만, '표준 정규 표현 언어'는 있지 않다. 약간 변형된 표현식이 많다. 예를 들어 'grep' 프로그램에도 'grep'과 'egrap'의 두가지가 있다. 위의 두 프로그램은 약간 다른 정규 표현식을 사용한다. perl은 가장 많은 정규 표현식을 가지고 있다. 다행이도 모든 표현식은 같은 원리를 가지고 있다. 한번만 이런 기본적인 원리를 이해하고 나면, 서로 다른 표현식이라도 쉽게 배울 수 있을 것이다.

이 기사에서는 기본적인 것들만 소개할 것이고, 나머지는 독자들이 직접 매뉴얼 페이지를 보면서 서로 다른 프로그램에 대해서 배울 수 있다.

간단한 예제

다음과 같은 회사의 전화번호 리스트가 있다고 가정을 해보자.

Phone Name  ID
...
...
3412 Bob 123
3834 Jonny 333
1248 Kate 634
1423 Tony 567
2567 Peter 435
3567 Alice 535
1548 Kerry 534
...

500명의 직원을 가진 회사이다. 위의 파일은 단순히 아스키 코드로 되어있는 Text 파일이다. 전화번호가 1로 시작되는 사람은 1번 건물에서 근무하는 사람들이다. 어떤 사람들이 1번 건물에서 근무하는지 알고 싶으면 어떻게 하여야 할까?

다음과 같은 정규 표현식이 그 답을 말해 준다 :
grep '^1' phonelist.txt
or
egrep '^1' phonelist.txt
or
perl -ne 'print if (/^1/)' phonelist.txt

위의 표현식은 첫 글자가 1인 모든 줄을 찾으라는 표현식이다. "^"는 줄의 시작을 나타낸다. 즉 첫 글자가 1인 줄을 찾으라는 것이다.

The syntax rules

한 문자 패턴

기본적인 정규 표현식은 한 문자 패턴(single-character pattern)으로 이루어져 있다. 정확히 한 문자와 맞는 경우를 말한다. 한 문자 패턴의 예는 위에 있는 1을 찾는 문제이다. 한 문자와 필적을 한다.

다른 한 문자 패턴의 예는 다음과 같다:
egrep 'Kerry' phonelist.txt

위의 패턴은 단순히 한 문자 패턴으로 구성되어 있다.( K,e.. 와 같은 문자)

문자들은 함께 그룹화 되어 집합이 될 수 있다. 집합은 '['로 시작해서 ']'로 끝나고, 그 사이에 문자들이 있는 것을 말한다. 집합 또한 한 문자 패턴이다. 집합 안에 있는 한 문자 만이 텍스트의 탐색에서 짝을 이룰 수 있다. 예를 들어 :

[abc]    a, b 혹은 c가 매치되는지 보는 한 문자 패턴이다.  

[ab0-9] a, b 혹은 숫자에 해당되는지를
나타내는 한 문자 패턴이다.

[a-zA-Z0-9\-] 대문자, 소문자, 숫자, 음수 기호(-)의 매치를
나타내는 한 문자 패턴이다.

다음과 같이 해보자:
egrep '^1[348]' phonelist.txt

위의 표현식은 13, 14, 18로 시작되는 줄을 탐색하게 된다.

대부분의 아스키 문자들은 매치되는지를 알아 보기 위해서 쓰지만 특별한 의미를 나타내는 아스키 문자들도 있다. 예를 들어 '['는 집합의 시작을 나타낸다. '-'는 범위를 나타내는 특별한 의미를 가진 문자이다. 이러한 문자를 의미없이 쓰려면 문자 앞에 '\'를 붙이면 된다. [a-zA-Z0-9\-]가 이러한 예이다. 일부 변형된 정규 표현식에서는 약간 다른 표현이 쓰인다. 특별한 문자가 '\'와 함께 시작되는 정규 표현식을 쓰는 경우도 있다. 이 경우 일반적인 아스키 문자를 나타내기 위하여 '\'를 제거해야 한다.

점(.)은 매우 특별한 의미를 가진 특수 문자이다. newline 문자를 제외한 모든 문자를 나태낸다. 예를 들어 :

grep '^.2' phonelist.txt
or
egrep '^.2' phonelist.txt

위의 표현은 두 번째 문자가 2이고, 첫 문자는 아무 문자나 나오는 줄을 탐색하는 표현이다.

집합의 처음을 '['로 사용하지 않고 '[^'로 사용하면 역집합을 나타낸다. '['뒤에 있는 '^'는 줄을 시작을 나타내지 않고 역을 나태낸다.

[0-9]    0과 9사이의 숫자를 나타내는 한 문자 패턴이다. 
[^0-9] 숫자가 아닌 문자를 나타낸다.
[^abc] a,b,c 문자가 아닌 모든 문자를 나타낸다.
. 점(.)은 newline 문자가 아닌 모든 문자를 나타낸다.
즉 [^\n]와 같다.
1로 시작되지 않는 줄을 찾기 위해서 다음과 같이 쓸 수 있다 :

grep '^[^1]' phonelist.txt
or
egrep '^[^1]' phonelist.txt

Anchors

'^'가 줄의 시작을 나타낸다고 위해서 배웠다. Anchor는 정규 표현식에서 문자의 위치를 나타내거나 텍스트에 없는 문자를 나타내는 특별한 문자이다.

^  줄의 시작을 나타낸다. 
$ 줄의 끝을 나타낸다.

phonelist.txt에서 회사 ID 번호가 567인 것을 찾기 위해서 다음과 같이 쓸 수 있다 :

egrep '567$' phonelist.txt

위는 줄의 끝이 567인 줄을 찾는다.

Multipliers

Multiplier는 한 문자 패턴이 텍스트에서 얼마나 자주 반복되는지를 결정한다.

description grep egrep perl vi vim vile elvis emacs
0번 이상 * * * * * * * *
1번 이상 \{1,\} + + \+ \+ \+ +
0번 혹은 1번 \? ? ? \= \? \= ?
n에서 m 번 \{n,m\} {n,m} \{n,m\} \{n,m\}

Note: 다양한 VI 프로그램들은 위와 같은 작업을 하기 위해서 매직 옵션을 두고 있다.

전화 번호 리스트에서의 예:

....
1248 Kate 634
....
1548 Kerry 534
....

1로 시작하고, 뒤에 숫자가 몇 개 오며, 적어도 하나의 공백이 있고, K로 시작하는 이름을 찾기 위해서는 다음과 같이 하면 된다.

grep '^1[0-9]\{1,\} \{1,\}K' phonelist.txt
또는 *와 [0-9]와 공백을 반복하여 :
grep '^1[0-9][0-9]* *K' phonelist.txt
또는
egrep '^1[0-9]+ +K' phonelist.txt
또는
perl -ne 'print if (/^1[0-9]+ +K/)' phonelist.txt

'*'는 바로 앞 한 문자의 반복을 나타낸다. 즉 "23*4"는 "2와3, 아무 문자나 여러 개, 4"를 나타내지 않는다.(이의 경우 "23.*4"이다.) 위의 식은 "한 개의2, 여러 개의 3, 한 개의4" 를 나타낸다.

또한 '*'는 게걸스럽다는(greedy) 걸 알아야 한다. 즉, '*'는 최대한 오른쪽으로 확장을 한다.

The expression ^1.*4
위의 식은 다음 줄 전체와 매치가 된다.
1548 Kerry 534
시작부터 4로 끝나는 걸 의미 하지, 154와 매치되지는 않는다.

grep에서는 별로 중요하지 않지만, 에디트를 하거나 대치를 할 경우 매우 중요하다.

Parentheses as Memory(메모리로서의 괄호?)

'Parentheses as Memory' 구조는 정규 표현식의 매치 방법은 변하지 않지만, 괄호로 묶인 부분은 기억되었다가 뒤에 쓰일 수 있다.

기억된 부분은 변수를 이용해서 뒤에 이용될 수 있다. 첫 번째 'Parentheses as Memory' 구조는 1 번 변수를 통해서 이용되고, 두 번째 'Parentheses as Memory' 구조는 2번 변수를 써서 이용된다.

프로그램 이름 parentheses syntax 변수 문법
grep \(\) \1
egrep () \1
perl () \1 or ${1}
vi,vim,vile,elvis \(\) \1
emacs \(\) \1

예:

 식  [a-z][a-z] 은 두 개의 소문자와 매치된다.  

이제 우리는 'otto'와 같은 텍스트를 찾기 위하여 변수를 쓸 수 있다.

egrep '([a-z])([a-z])\2\1'

변수 \1은 'o'를 저장하고 있고, \2는 't'를 저장하고 있다.

'anna'와 같은 이름과는 매치되지만, 'yxyx'와 같은 이름과는
매치되지 않는다.

'Parentheses as Memory' 구조는 'otto'나 'anna'와 같은 이름을 찾는데는 많이 쓰이지 않고, 대신 에디트를 하거나, 대치(substitution)을 하는데 많이 쓰인다.

Text를 편집하면서 정규 표현식 쓰기

에디트를 하기 위해서 vi나 emacs혹은 perl과 같은 것을 사용해야 한다.

emacs에서는 M-x query-replace-regexp 혹은 query-replace-regexp 버튼을 사용사용한다. 또는 replace-regexp 명령을 사용할 수 있다. query-replace-regexp만 interactive하고, 나머지는 그렇지 않다.

vi에서는 대치 명령이 %s/ / /gc이다. 여기서 '%'는 '파일 전체'를 나타낸다. 아니면 적당한 범위를 지정해 줄 수도 있다. vim에서는 shift-v를 친 후에 대치하기를 원하는 부분을 지정해 줄 수 있다. 여기서는 vim에 대한 자세한 설명을 해 줄 수 없다. 메뉴얼을 스스로 보라. 'gc'는 interactive한 것을 나타낸다. s/ / /g는 interactive하지 않음을 나타낸다.

interactive하다는 것은 매치되는 것을 만날 때마다, 대치를 할 것인지 안 할 것인지 물어 보는 것을 말한다.

perl에서는 다음과 같이 사용할 수 있다.

perl -pe 's/ / /g' 

몇 가지 예를 보자. 위에 나온 회사에서 전화 번호가 바뀌어 1과 2로 시작하는 번호는 두번째 위치에 2가 추가 되었다. 예를 들어 1423은 14223으로 되었다.

예전의 리스트 :

Phone Name ID
...
3412 Bob 123
3834 Jonny 333
1248 Kate 634
1423 Tony 567
2567 Peter 435
3567 Alice 535
1548 Kerry 534
...

다음과 같이 하면 된다:

vi:    s/^\(1.\)/\12/g
emacs: ^\(1.\) replaced by \12
perl: perl -pe 's/^(1.)/${1}2/g' phonelist.txt


새로운 리스트는 다음과 같을 것이다.

Phone Name ID
...
3412 Bob 123
3834 Jonny 333
12248 Kate 634
14223 Tony 567
2567 Peter 435
3567 Alice 535
15248 Kerry 534
...

Perl은 메모리 변수를 \1부터 \9까지 사용하므로 \12는 텅 비어있는 12번째 변수를 참조하고 있다. 이러한 문제를 해결하기 위하여 단순히 ${1}을 사용하면 된다.

위의 리스트는 아직도 약간 정렬이 잘못되어 있다. 어떻게 하면 고칠 수 있을까? 5번째 위치에 공백이 있는지 없는지 검사를 하고, 공백이 없으면 하나의 공백을 집어 넣으면 된다.

vi:     s/^\(....\) /\1  /g
emacs: '^\(....\) ' replaced by '\1 '
perl: perl -pe 's/^(....) /${1} /g' phonelist.txt

이제 리스트는 다음과 같을 것이다.

Phone Name ID
...
3412 Bob 123
3834 Jonny 333
12248 Kate 634
14223 Tony 567
2567 Peter 435
3567 Alice 535
15248 Kerry 534
...

만약에 수작업을 하다가 줄의 시작에 몇 개의 공백을 입력했다면 공백들을 어떻게 제거할 수 있을까?

Phone Name  ID
...
3412 Bob 123
3834 Jonny 333
12248 Kate 634
14223 Tony 567
2567 Peter 435
3567 Alice 535
15248 Kerry 534
...


다음과 같이 하면 된다.
vi: s/^ *// (There is 2 spaces as we do not have a +)
emacs: '^ +' replaced by the empty string
perl: perl -pe 's/^ +//' phonelist.txt

소스 코드를 작성하면서 temp라는 변수와 temporary라는 변수를 사용하고 있다고 가정을 하자. 그런데 temp를 counter로 바꾸고자 한다. 단순히 temp가 counter로 바뀌면 temporary는 counterorary로 바뀌어 버린다.

정규 표현식은 이런 일을 할 수 있다. 단순히 temp([^o])를 counter\1로 바꾸면 된다. 즉, tempo가 아니라고 말해주면 된다. (크기의 경계을 두는 방법도 있지만, 우리는 이러한 방식의 패턴을 배우지 않았다.)

Regular expressions can do it. Just replace temp([^o]) with counter\1. That is, temp and not the letter o. (An alternative solution would be to use boundaries but we have not discussed this kind of anchoring pattern.)

이 글을 읽고 흥미를 느꼈으면 하는 바램이다. 이제 당신은 좋아하는 에디터의 맨 페이지나, 메뉴얼을 보면서 더욱 자세하게 배워야 한다.

또한 위에서 말한 경계나 "or"를 나타내는 특별한 문자도 있다.

재미있게 보셨나요? 직접 해보세요..:)

이 글은 스프링노트에서 작성되었습니다.

Posted by revoman
TAG Linux, unix
  1. unlink 명령어를 사용한다.
  2. rm -i *
  3. rm ./\-...

이 글은 스프링노트에서 작성되었습니다.

Posted by revoman
TAG Linux, unix

참고 사이트 

http://www.ibm.com/developerworks/kr/library/au-unix-sysadmin1.html

http://dolbbi.com/tag/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4

 

Listing 1. BSD 유닉스 계열에서 사용자 프로세스 목록 보기

                
$ ps
PID TT STAT TIME COMMAND
391 p5 S 0:00.24 /bin/bash
9165 p5 S+ 0:00.50 emacs
476 p6 S 0:01.03 /bin/bash
9299 p6 S 0:00.09 xterm
9319 p6 S 0:00.07 xterm
9423 p6 S 0:00.12 ftp atuin
9513 p6 R+ 0:00.01 ps
9301 p7 Ss+ 0:00.01 /usr/X11R6/bin/luit
9302 p8 Ss+ 0:00.03 bash
9321 p9 Ss+ 0:00.01 /usr/X11R6/bin/luit
9322 pa Ss+ 0:00.02 bash

 

SVR4 계열에서는 출력되는 정보가 더 간략하다. Listing 2에서 보듯이, 프로세스 상태가 출력되지 않는다.


Listing 2. SVR4 유닉스 계열에서 사용자 프로세스 목록 보기

                
$ ps
PID TTY TIME CMD
19915 pts/3 00:00:00 bash
29145 pts/3 00:00:00 emacs
32256 pts/3 00:00:00 emacs
26986 pts/3 00:00:00 xterm
31303 pts/3 00:00:00 ftp
31358 pts/3 00:00:00 ps

 

시스템에서 돌아가는 프로세스 전체 목록을 얻으려면 명령행 옵션을 지정한다. 물론 유닉스 계열에 따라서 옵션이 달라진다. BSD 계열에서 (명령 자신을 포함하여) 모든 사용자 프로세스 목록을 출력하려면 -a 옵션을 사용한다. 하지만 이 옵션은 제어 터미널이 없는 프로세스를 포함하지 않는다. 즉, 데몬, 시스템을 시작할 때 수행되는 프로세스, cron으로 수행되는 프로세스 등은 출력하지 않는다. 이러한 프로세스까지 모두 포함하려면 -A 옵션을 사용한다(Listing 3 참조).


Listing 3. BSD 유닉스 계열에서 전체 프로세스 목록 보기

                
$ ps -A
PID TT STAT TIME COMMAND
1 ?? S<s 0:15.47 /sbin/launchd
23 ?? Ss 0:00.02 /sbin/dynamic_pager -F /private/var/vm/swapfile
27 ?? Ss 0:00.95 kextd
49 ?? Ss 0:05.17 /usr/sbin/configd
50 ?? Ss 0:01.89 /usr/sbin/coreaudiod
51 ?? Ss 0:04.40 /usr/sbin/diskarbitrationd
52 ?? Ss 0:00.08 /usr/sbin/memberd -x
53 ?? Ss 0:02.80 /usr/sbin/securityd
55 ?? Ss 11:03.59 /usr/sbin/notifyd
57 ?? Ss 0:01.13 /usr/sbin/DirectoryService
...
8051 p2 S+ 0:00.61 ssh root@bear
292 p3 Ss 0:00.02 bash
372 p3 S+ 0:00.42 ssh admin@atuin
312 p4 Ss+ 0:00.03 bash
332 p5 Ss 0:00.03 bash
391 p5 S 0:00.24 /bin/bash
9165 p5 S+ 0:00.50 emacs
352 p6 Ss 0:00.04 bash
476 p6 S 0:01.04 /bin/bash
9299 p6 S 0:00.09 xterm
9319 p6 S 0:00.07 xterm
9423 p6 S 0:00.14 ftp atuin
9520 p6 R+ 0:00.01 ps -A
9301 p7 Ss+ 0:00.01 /usr/X11R6/bin/luit
9302 p8 Ss+ 0:00.03 bash
9321 p9 Ss+ 0:00.01 /usr/X11R6/bin/luit
9322 pa Ss+ 0:00.02 bash

 

-A 명령행 옵션은 -a-x 옵션과 동일하다. 여기서 -a는 제어 터미널이 있는 프로세스 목록을 출력하고, -x는 제어 터미널이 없는 프로세스 목록을 출력한다.

SVR4 계열에서 모든 프로세스를 출력하려면 -e 옵션을 사용한다. -e 옵션은 제어 터미널이 있는 프로세스와 없는 프로세스를 모두 출력한다. BSD 계열에서 제공하는 -A 옵션과 같다. Listing 4는 SVR4 계열에서 모든 프로세스를 출력한 결과다.


Listing 4. SVR4 유닉스 계열에서 전체 프로세스 목록 보기

                
$ ps -e
PID TTY TIME CMD
0 ? 15:24 sched
1 ? 0:00 init
2 ? 0:00 pageout
3 ? 0:00 fsflush
308 ? 0:00 devfsadm
7 ? 0:06 svc.star
9 ? 0:10 svc.conf
506 ? 0:00 htt_serv
260 ? 0:00 rpcbind
259 ? 0:00 cron
52 ? 0:00 dhcpagen
282 console 0:00 ttymon
267 ? 0:00 lockd
264 ? 0:00 statd
90 ? 0:00 sysevent
...
462 ? 0:00 smcboot
464 ? 0:00 smcboot
463 ? 0:00 smcboot
473 ? 0:00 htt
552 ? 0:00 in.telne
527 ? 0:00 dmispd
548 ? 0:01 snmpd

 

위에서 보듯이, Listing 3과 Listing 4는 출력되는 열 개수가 다르다. 하지만 필요하다면 언제든 원하는 열을 지정해 출력할 수도 있다.

특정 정보 찾기

ps 도구가 표준으로 제공하는 정보는 다양하다. 예를 들어 SVR4 계열에서 흔히 사용하는 ps -ef 명령은 부모 프로세스 ID, CPU 사용량, 시작 시간 등 자세한 정보를 제공한다. Listing 5는 SVR4 계열에서 ps -ef 명령을 실행한 결과다.


Listing 5. SVR4 유닉스 계열에서 좀 더 상세한 정보 보기

                
ps -ef
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 15:56:26 ? 15:24 sched
root 1 0 0 15:56:26 ? 0:00 /sbin/init
root 2 0 0 15:56:26 ? 0:00 pageout
root 3 0 0 15:56:26 ? 0:00 fsflush
root 308 1 0 15:57:09 ? 0:00 devfsadmd
root 7 1 0 15:56:29 ? 0:06 /lib/svc/bin/svc.startd
...
root 562 1 0 15:58:17 ? 0:00 /usr/lib/sendmail -bd -q15m
root 576 555 1 16:01:47 pts/1 0:00 ps -ef
root 416 1 0 15:57:14 ? 0:00 /usr/sbin/syslogd
smmsp 561 1 0 15:58:17 ? 0:00 /usr/lib/sendmail -Ac -q15m
...
root 552 283 0 15:57:47 ? 0:00 /usr/sbin/in.telnetd
root 527 1 0 15:57:22 ? 0:00 /usr/lib/dmi/dmispd
root 548 1 0 15:57:24 ? 0:01 /usr/sfw/sbin/snmpd

 

BSD 계열에서는 보통 -l 옵션을 추가한다. 여기서 l은 "long"을 뜻한다. Listing 6은 BSD 계열에서 ps -al 명령을 실행한 결과다.


Listing 6. BSD 유닉스 계열에서 좀 더 상세한 정보 보기

                
$ ps -al
UID PID PPID CPU PRI NI VSZ RSS WCHAN STAT TT TIME COMMAND
0 9165 391 0 31 0 57896 6376 - S+ p5 0:00.50 emacs
501 352 349 0 31 0 27784 52 - Ss p6 0:00.04 bash
0 476 352 0 31 0 27784 600 - S p6 0:01.05 /bin/bash
0 9299 476 0 31 0 44988 1880 - S p6 0:00.09 xterm
0 9319 476 0 31 0 44988 1888 - S p6 0:00.07 xterm
0 9423 476 0 31 0 27504 488 - S p6 0:00.15 ftp atuin
0 9540 476 0 31 0 27384 504 - R+ p6 0:00.01 ps -axl
0 9301 9299 0 31 0 27332 452 - Ss+ p7 0:00.01 /usr/X11R6/bin/luit
0 9302 9301 0 31 0 27784 888 - Ss+ p8 0:00.03 bash
0 9321 9319 0 31 0 27332 452 - Ss+ p9 0:00.01 /usr/X11R6/bin/luit
0 9322 9321 0 31 0 27784 888 - Ss+ pa 0:00.02 bash

 

Listing 5와 Listing 6에서 살펴본 옵션은 확실히 많은 정보를 출력한다. 하지만 정보가 많다고 무조건 바람직하지는 않다. 관리자가 특정한 정보를 원한다면 나머지 정보가 오히려 부담스러울 수도 있다.

다행스럽게도 ps 명령은 출력할 열을 지정할 수 있다. 즉, 유닉스 계열이 달라도 동일한 결과를 표준화된 형식으로 얻어낼 수 있다는 뜻이다.

출력할 열을 지정하려면 -o 옵션을 사용한다. -o 옵션 뒤에 원하는 열 이름을 추가하면 된다. 여러 열을 출력하려면 각 열 이름을 쉼표로 분리한다. 유닉스 계열마다 지원되는 열 종류는 약간씩 차이가 있지만, 대다수 열이 표준으로 지원된다. 예를 들어 pid, ppid(부모 pid), 명령, RSS(Resident Set Size 또는 메모리 사용량), 우선순위는 모든 유닉스 환경에서 제공한다.

-o 옵션 뒤에 열 이름을 지정할 때는 출력하려는 순서대로 지정한다. 예를 들어 BSD 계열에서 pid, ppid, 명령 열을 출력하려면 -opid,ppid,command라고 지정한다. SVR4 계열에서는 -opid,ppid,comm라고 지정한다. Listing 7Listing 8은 각각 BSD 유닉스 계열과 SVR4 유닉스 계열에서 명령을 실행한 결과다.


Listing 7. BSD 유닉스 계열에서 열 지정하기

                
$ ps -o pid,ppid,command
PID PPID COMMAND
391 332 /bin/bash
9165 391 emacs



Listing 8. SVR4 유닉스 계열에서 열 지정하기

                
$ ps -opid,ppid,comm
PID PPID COMMAND
555 552 -sh
622 555 ps

 

이제 원하는 열을 찾아냈으니, 이번에는 원하는 순서로 정보를 정렬해 보자. 기본적으로 ps 명령은 프로세스 ID 값으로 목록을 정렬하지만 이는 찾고자 하는 정확한 정보를 가려버릴지도 모른다. 만약 메모리가 부족한 프로세스를 찾고 싶다면 프로세스 ID로 정렬된 목록보다 메모리 사용량으로 정렬된 목록이 훨씬 더 유용하다.

일부 ps 버전은 별도로 명령행 옵션을 제공한다. 예를 들어 BSD 계열에서는 -m 옵션과 -r 옵션이 존재하는데, -m 옵션은 메모리 사용량 순으로 목록을 정렬하고, -r 옵션은 CPU 사용량 순으로 목록을 정렬한다. 대다수 SVR4 계열은 별다른 옵션을 제공하지 않는다. 하지만 두 계열 모두 pssort를 조합해 원하는 결과를 얻어낼 수 있다. 예를 들어 BSD 계열에서 CPU 사용량에 따라 프로세스 목록을 정렬하려면 Listing 9와 같은 명령을 실행한다.


Listing 9. BSD 유닉스 계열에서 CPU 사용량 추적하기

                
$ ps -A -o pid,%cpu,command|sort -n +1
...
358 0.1 ftp
11425 0.1 /bin/bash
28684 0.3 trivial-rewrite -n rewrite -t unix -u
356 0.4 ssh
354 0.5 as
23988 1.1 emacs
136 14.6 cc1plus
26306 23.6 cpp

 

SVR4 계열에서는 pcpu%cpu로 변할 뿐 나머지 부분은 같다. Listing 10을 참조한다.


Listing 10. SVR4 유닉스 계열에서 CPU 사용량 추적하기

                
$ ps -e -opid,pcpu,comm|sort -n +1
...
3 0.1 fsflush
555 0.1 -sh
627 0.2 sort
628 0.2 ps

 

위 명령 체인은 정말로 필요한 정보를 얻기 위해 열 이름으로 프로세스 목록을 찾은 후 특정한 열에 따라 목록을 정렬한다. 열 이름이 아니라 다른 조건으로 프로세스 목록을 찾으려면 다음 방법을 사용한다.

특정 프로세스 찾기

동작 중인 프로세스 목록을 찾아냈다면, 분명히 특정 프로세스를 찾아내야 할 경우가 생긴다. 정확하게 원하는 정보만 뽑아내는 가장 간단한 방법은 psgrep 명령 조합이다. 일부 유닉스 계열은 pgrep 같이 별도 유틸리티를 제공하지만, 일반적으로 그냥 grep을 사용해도 전혀 문제가 없다.

$ ps -ef|grep bash

 

ps 명령 자체에서 프로세스를 보기 위해 옵션으로 특정 조건을 지정하는 방법도 있다. 사용자 ID, 부모 프로세스, 제어 터미널 등은 ps 도구에서 구체적인 옵션을 제공한다. 예를 들어 -U 옵션은 특정한 사용자가 소유하는 프로세스 목록을 출력한다. Listing 11은 현재 root가 소유하는 프로세스 목록이다.


Listing 11. 사용자가 소유하는 프로세스 보기

                
$ ps -U root
PID TTY TIME CMD
0 ? 15:24 sched
1 ? 0:00 init
2 ? 0:00 pageout
3 ? 0:02 fsflush
308 ? 0:00 devfsadm
7 ? 0:06 svc.star
...
552 ? 0:00 in.telne
527 ? 0:00 dmispd
629 pts/1 0:00 ps
548 ? 0:01 snmpd

 

특정한 터미널에서 수행한 프로세스 목록을 보려면 -t 옵션을 사용한다. Listing 12를 참조한다.


Listing 12. 특정한 터미널에서 수행한 프로세스 보기

                
$ ps -t 3
PID TTY TIME CMD
19915 pts/3 00:00:00 bash
29145 pts/3 00:00:00 emacs
32256 pts/3 00:00:00 emacs

  • HP-UX에서는 다음과 같이 UNIX95 환경 변수를 선언하면 XPG4 포맷의 ps 명령어를 사용할 수 있다.

    setenv UNIX95 1 on csh

    export UNIX95=1 on sh

ps -e -o pid,comm,pcpu,vsz

이 글은 스프링노트에서 작성되었습니다.

Posted by revoman

rm -f  명령어 수행시 인수명단이 너무 길다는 에러가 발생할 때 다음과 같이 삭제할 수 있다.

 

 ls | xargs -n 100 rm -f

이 글은 스프링노트에서 작성되었습니다.

Posted by revoman
TAG Linux, unix

자동 셧다운/부팅 설정

  • 목표 : 새벽 2~6시에는 전원을 내려, 시스템 안정성 및 전기세 감면 하기 위함.

 

00 2   * * *   root /sbin/shutdown -h +5

이 글은 스프링노트에서 작성되었습니다.

Posted by revoman
TAG Linux, server

 

NAME

du - summarize disk usage

 

SYNOPSIS

du [OPTION]... [FILE]...

 

DESCRIPTION

The du utility writes to standard output  the  size  of  the file  space  allocated  to,  and  the size of the file space allocated to each subdirectory of, the file hierarchy rooted in  each  of the specified files.

 

EXAMPLE

  1. du -s /home/* : home 디렉토리 밑의 디렉토리별 디스크 사용량을 요약해서 보여준다.
  2. du -s ~계정명 : 해당 계정의 디스크 사용량을 요약해서 보여준다.

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by revoman
TAG Linux, unix

책 정보

제   목 : 열씨미와 게을러의 리눅스 개발 노하우 탐험기

글       : 박재호

Homepage : http://jhrogue.blogspot.com/

인용

[목차]

1장. 단순한 파일 비교를 넘어서
2장. 원시 코드 색인은 나에게 맡겨라
3장. 공유 라이브러리와 심볼 이름을 찾아라
4장. 분위기 파악 못하는 훼방꾼 configure(1)
5장. 분위기 파악 못하는 훼방꾼 configure(2)
6장. 자동화된 빌드 시스템 구축(1)
7장. 자동화된 빌드 시스템 구축(2)
8장. 숨겨진 1인치의 의존성을 찾아라
9장. 메모리 디버깅을 위한 친구
10장. 프로그램을 동적으로 추적하는 도구
11장. 스택 탐색을 통한 디버깅
12장. 스택 탐색을 통한 백트레이스 구현
13장. 공포의 커널 패닉과 웁스
14장. raw 디바이스 다루기

 

이 글은 스프링노트에서 작성되었습니다.

Posted by revoman
TAG Linux

[LINK]LINUX-HA

시스템 관리 / 2008/03/17 17:00
http://linux-ha.org

The basic goal of the High Availability Linux project is to:

Provide a high availability (clustering) solution for Linux which promotes reliability, availability, and serviceability (RAS) through a community development effort...

Posted by revoman
TAG HA, Linux

man to text

Unix & Linux / 2008/03/14 10:29

 

Convert man Pages to Text

$ man <command> | col -b > filename.txt

 

man <command> = display the man pages for a stated command

| = pipe the output of the man pages somewhere else

col -b = format the output

> = send the output to a file

filename.txt = name of the file you wish to create and populate with output

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by revoman
TAG Linux, unix

최근에 달린 댓글

최근에 받은 트랙백

글 보관함