본문 바로가기

Linux/기타

프로세스#1


http://192.168.0.43:2015/

userid : boan

passwd : boan2015


주제 : 프로세스



o 프로세스란 ?

- 프로세스는 실행중인 프로그램이다.

- 프로그램은 하드디스크에 파일형태로 저장되어 있다.

- 프로그램은 실행 시에 프로세스를 어떻게 만들지에 대한 광범위한 정보를 담고있는 파일이다.


- Unix, Linux : ELF 포맷을 사용 ( 실행파일 형식 )
- Windows : PE 포맷을 사용 ( 실행파일 형식 )




o 프로세스의 상태 

신규 : 프로세스가 생성된 상태

준비 : 프로세스가 처리기의 배정을 기다리고 있는 상태

실행 : 프로세스의 명령이 실행되고 있는 상태

대기 : 프로세스가 어떤 사건이 발생하기를 기다리고 있는 상태

종료 : 프로세스의 실행이 종료된 상태


       signal        +---------+      signal                                                           

          .--------- | 중단 중 | <------.                                                                 

          |          +---------+        |                                                                 

          v                             |                                                                 

     +----------+  -------------->  +--------+        +--------+     

---> | 실행준비 |    scheduling     | 실행중 |  --->  | Zombie |    

     +----------+  <--------------  +--------+        +--------+   

          ^                             |                                                          

          | input/output(완료)          | input/output                                             

          |          +---------+        |                                                              

          `--------- | 중단 중 | <------'                                                                 

                     +---------+     


o 프로세스의 생성 

- 한 프로세스는 다른 프로세스를  fork()를 이용하여 생성하고 exec()계열의 함수에 의해서 실행한다.

- 부모 프로세스 (parent process)  : 자식 프로세스를 만드는 프로세스

- 자식 프로세스 (child  process)  : 부모 프로세스에 의해 생성된 프로세스

- 부모와 자식은 자원의 일부 혹은 전부를 공유하거나 운영체제로부터 자원을 할당 받는다.


* bash 프로세스가 명령어를 실행할 때의 상태

                              부모 프로세스는 자식 프로세스가                                                           

       +---------------+          종료되기까지 Wait 상태              +---------------+                   

 --->| 부모 프로세스    | ------------------------------------------>  | 부모 프로세스 |

       +---------------+                                                  +---------------+            

                |                                                            ^                               

                | fork() 에 의해                                             |                                  

                | 자식 프로세스 생성                                         | exit() 에 의해                           

                v                                                            | 실행 프로세스 종료                    

           +---------------+                 +--------------------+          |

           | 자식 프로세스 |  ------------>  | 실행 프로세스 대체 |  --------'

           +---------------+                 +--------------------+ 

                              exec() 에 의해                                                                   

                               실행해야 할 프로세스로 대체                                                              


    

                              부모 프로세스는 자식 프로세스가                                                           

      +--------------+          종료되기까지 Wait 상태              +-------------+                          

 ---> | bash (1000)  | ------------------------------------------>  | bash (1000) |                  

      +--------------+                                              +-------------+                     

                |                                                            ^                               

                | fork() 에 의해                                             |                                  

                | 자식 프로세스 생성                                         | exit() 에 의해                           

                v                                                            | 실행 프로세스 종료                    

            +-------------+               +--------------------+             | 

            | bash (2000) | ----------->  | 실행 프로세스 대체 |  -----------'

            +-------------+               +--------------------+ 

                               exec() 에 의해 실행해야 할 프로세스로 대체    


                                                             

o 프로세스의 실행 측면의 두가지 가능성

- fork() 로 자식을 생성하면 부모와 자식 프로세스가  동시에 실행

- 부모프로세스는 자식의 일부 또는 전부가 종료될때까지 wait



o 주소공간의 경우에서의 두가지 가능성

- 자식은 부모의 복사판 (fork())

- 자식 프로세스는 별도의 프로그램을 적재 (exec() 계열의 함수 man execl)



o 프로세스의 종료

- exit 명령

 자신의 마지막 명령이 수행된 후 운영체제에게 요청하고 자신은 종료

- abort 명령

 강제종료, 부모프로세스만이 권한 행사

 줄초상 (Xwindow 종료가 되면 Xwindow 에서 실행된 프로세스들 모두 종료)

 부모가 종료되면 자식들도 따라서 강제로 종료 

 부모가 종료되면 자식들을 init 프로세스(PID 1)가 걷어드린다.


ex)

# ./test.sh 1&

# pstree 

init-+

     |  : 

     |  : 

     |-sshd---sshd---bash-+-pstree

     |                    `-test.sh---sleep


# /etc/init.d/sshd stop

init-+-acpid

     |  : 

     |  : 

     |-sshd---bash-+-pstree

     |             `-test.sh---sleep

# pstree -p


o 프로세스의 우선순위 


각 프로세스는 실행시 우선순위를 가진다. 

특별히 지정하지 않는다면 우선순위는 모두 동일하게(0) 실행된다.

아래 명령어를 이용해서 프로세스의 우선순위를 지정할 수 있다.

nice : 프로세스를 실행할때 우선순위를 지정한다.

renice : 실행되고 있는 프로세스의 우선순위를 변경한다.


프로세스 우선순위 범위

+----------+----------+

-20            0              19


프로세스의 우선순위 낮추기

+ 쪽으로 가면 프로세스의 우선순위가 낮아진다. (일반유저도 사용가능하다.)

사용법 : renice +19 PID


프로세스의 우선순위 높히기

- 쪽으로 가면 프로세스의 우선순위가 높아진다. 

  (일반유저는 우선순위를 높힐 수 있는 권한이 없다. 오직 root 만이 가능하다.)

사용법 : renice -1 PID




o 프로세스 실행방식
- 포그라운드 프로세스 (foreground process) 로 실행하는 방식
  사용자와 직접적으로 대화하는 프로세스
  bash 에서 실행하는 프로그램은 대부분 포그라운드 프로세스로 실행된다.
- 백그라운드 프로세스 (background process) 로 실행하는 방식
  사용자와 직접적으로 대화하지 않고 사용자 뒤에서 실행되는 프로세스
  데몬, 시스템운영에 필요한 프로세스들이 백그라운드 프로세스로 이미 동작한다.
  쉘에서 명령어를 실행할 때 반드시 &(엠퍼센트) 기호를 명령어 뒤에 
  써고 실행해야 백그라운드로 실행된다.
  단 백그라운드로 돌지 않는 프로세스들도 있으므로 이런 프로세스를 
  백그라운드로 실행시 중지된다. 
  중지된 프로세스는 ps 로 확인시 state 에 T (중지) 로 표시된다.  
  e.g.) vi&, top& (ex 명령어&)

쉘에서 백그라운드 프로세스로 실행하고 포그라운드 프로세스로 변경하는
방법과 쉘에서 포그라운드 프로세스로 실행하고 백그라운드 프로세스로 
변경하는 방법을 잘 알아두어야 한다.

o 프로세스 전환 방법
포그라운드 -> 백그라운드 -> Ctrl + Z + bg %작업번호
백그라운드 -> 포그라운드 -> fg 작업번호


o 데몬 프로세스
- 데몬 프로세스는 백그라운드로 동작하면서 외부의 요청에 응답하는 프로세스이거나 
  특정 서비스를 실행시켜주는 프로세스
e.g.) 웹서버 데몬, 크론 데몬, 원격접속 데몬, 커널 데몬  ...


o 데몬 프로세스

프로세스이거나 특정 서비스를 실행시켜주는 프로세스


데몬 프로그램들의 위치

- 데몬 프로그램은 컴파일된 바이너리이고 관리자가 실행하는 프로그램이므로

  주로 /usr/sbin 디렉토리에 위치한다.

  /usr/sbin/crond   /usr/sbin/httpd ...

데몬을 실행시키는 스크립트 디렉토리

- /etc/rc.d/init.d


데몬을 실행시키는 스크립트 예

 /etc/rc.d/init.d/crond : crond 데몬을 실행시키는 스크립트


데몬을 실행시키는 예

crond 데몬을 실행 : /etc/rc.d/init.d/crond start

crond 데몬을 실행 : /etc/init.crond start


데몬을 중지시키는 예

crond 데몬을 중지 : /etc/rc.d/init.d/crond stop

crond 데몬을 중지 : /etc/init.crond stop


* /proc 디렉토리

 - 실제 메모리에서 동작중인 상태를 디렉토리화 시켜놓고 사용자에게 보여주는 것.(가상 파일 시스템 디렉토리)



o signal(신호)
----------+-------------------------------------------------
 시그널명 |  설명  
----------+-------------------------------------------------
SIGHUP    | 터미널을 읽어버렸을때 발생한다.  
SIGABRT   | 프로그램의 비정상종료시 발생한다.  
SIGINT    | Control-C 나 DELETE 키를 입력했을때 발생한다.  
SIGKILL   | 프로세스를 죽이기 위해서  
SIGPIPE   | 단절된 파이프에 write 할경우 발생  
SIGSEGV   | 잘못된 메모리 참조(주로 포인터를 잘못 썼을때)  
SIGSTOP   | 프로세스의 일시중단 (Ctrl+z)  
SIGSUSR1  | 사용자를 위해 정의된 시그널  
   :
   :
----------+-------------------------------------------------


=========================================================================

PROC-LAB> ps, kill, pstree 의 패키지를 확인해보자.


- 기본적인 프로세스 관련 명령어의 패키지를 확인한다.

# rpm -qf `which ps`

procps-3.2.7-18.el5

# rpm -qf `which pstree`

psmisc-22.2-7.el5_6.2

# rpm -qf `which kill`

util-linux-2.13-0.59.el5


- 명령어의 패키지에 포함된 파일들의 리스트들을 확인한다.

# rpm -ql procps

# rpm -ql psmisc

# rpm -ql util-linux


- 패키지에 대한 정보를 출력한다.

# rpm -qi procps

# rpm -qi psmisc

# rpm -qi util-linux


- 패키지에 포함된 명령어들을 출력한다.

# rpm -qi procps | grep bin

# rpm -qi psmisc | grep bin

# rpm -qi util-linux | grep bin

=========================================================================


=========================================================================

PROC-LAB> ps, kill, pstree , top 명령어를 실행해보자.

# ps


- 시스템에서 실행중인 모든 프로세스를 보여주는 옵션이다.

( BSD 계열 UNIX, SYSTEM V 계열 UNIX에 따라 명령어가 다름)

# ps aux

# ps -ef


# pstree

# pstree -p


# top : 현재 동작중인 프로세스들을 실시간으로 보여준다.

(h : 도움말, q : 종료)

=========================================================================



====================================================================

PROC-LAB> signal 번호를 확인해보자.


# kill -l

 1) SIGHUP      2) SIGINT          3) SIGQUIT             4) SIGILL

 5) SIGTRAP      6) SIGABRT         7) SIGBUS             8) SIGFPE

 9) SIGKILL     10) SIGUSR1     11) SIGSEGV      12) SIGUSR2

13) SIGPIPE     14) SIGALRM     15) SIGTERM         16) SIGSTKFLT

17) SIGCHLD     18) SIGCONT     19) SIGSTOP      20) SIGTSTP

21) SIGTTIN     22) SIGTTOU     23) SIGURG         24) SIGXCPU

25) SIGXFSZ     26) SIGVTALRM     27) SIGPROF      28) SIGWINCH

29) SIGIO           30) SIGPWR         31) SIGSYS            34) SIGRTMIN

35) SIGRTMIN+1     36) SIGRTMIN+2     37) SIGRTMIN+3      38) SIGRTMIN+4

39) SIGRTMIN+5     40) SIGRTMIN+6     41) SIGRTMIN+7      42) SIGRTMIN+8

43) SIGRTMIN+9     44) SIGRTMIN+10     45) SIGRTMIN+11      46) SIGRTMIN+12

47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14

51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10

55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6

59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

63) SIGRTMAX-1 64) SIGRTMAX


# kill -9 PID  or kill -SIGKILL PID

====================================================================


====================================================================

PROC-LAB> kill 을 이용해서 프로세스를 종료해보자.

- 전체 프로세스(ps aux)에서 bash 문자열을 화면에 출력한다.

      !!! 각 사용자마다 프로세스 번호(PID)가 다를 수 있다 !!!

# ps aux | grep bash

root      3848  0.0  0.5   4748  1496 tty1     Ss+  Nov02   0:00 -bash

root     11914  0.0  0.6   5896  1616 pts/0    Ss   16:59   0:00 -bash

root     12549  0.0  0.5   4772  1524 pts/1    Ss+  18:37   0:00 -bash

root     12581  0.0  0.2   5148   720 pts/0    R+   18:37   0:00 grep bash

# tty

/dev/pts/0


# kill 12549   ---> 12549 프로세스에 15번 신호가 날아간다 (SIGTERM)

# ps aux | grep bash

root      3848  0.0  0.5   4748  1496 tty1     Ss+  Nov02   0:00 -bash

root     11914  0.0  0.6   5896  1620 pts/0    Ss   16:59   0:00 -bash

root     12549  0.0  0.5   4772  1524 pts/1    Ss+  18:37   0:00 -bash    --> 죽지 않았다

root     12586  0.0  0.2   5148   724 pts/0    R+   18:38   0:00 grep bash

===> kill 명령어의 signal 번호가 없다면 기본값은 15(SIGTERM) 신호가 보내진다.

===> 내부적으로 15번 신호를 차단해놨기 때문에 프로세스가 죽지 않는다.

===> 차단해놓지 않았다면 프로세스가 죽게 된다.


# kill -SIGKILL 12549

# ps aux | grep bash

root      3848  0.0  0.5   4748  1496 tty1     Ss+  Nov02   0:00 -bash

root     11914  0.0  0.6   5896  1620 pts/0    Ss   16:59   0:00 -bash

root     12590  0.0  0.2   5148   724 pts/0    R+   18:39   0:00 grep bash

===> kill 명령어는 -9 or -SIGKILL 이라는 두 가지 형식으로 signal 을 프로세스에게 보낼 수 있다.

===> 이 signal은 절대로 막을 수 없다.

====================================================================


====================================================================

PROC-LAB> kill 을 이용해서 프로세스를 종료해보자. 

- yes 명령어는 y를 화면에 계속 출력하는 무한루프 프로그램이다

# yes

y

y

  :

  :

- 다른터미널에서 yes를 실행한 프로세스를 찾아서 종료시켜 보자. <----이거못함

# tty

/dev/pts/0

# ps aux | grep yes

root     12668 22.7  0.1   3804   484 pts/1    R+   18:45   0:02 yes

root     12670  0.0  0.2   5148   724 pts/0    R+   18:45   0:00 grep yes



- kill -SIGINT(-2) 를 받은 후 (Ctrl + C) 효과가 발생되서 yes 가 종료되었다.

- kill -SIGINT or -2 두 가지로 프로세스에게 signal을 전송할 수 있다.


# kill -SIGINT 12668 

====================================================================


alias 명령어

함수

내부명령어

외부명령어

키워드


* 내부명령어인지 외부명령어인지 확인하는 방법

man cd

help cd

which cd -> 안나오면 내부명령어


=======================================================================

PROC-LAB> 일반유저가 프로세스의 우선순위 변경하기


- 사용자 procuser 를 생성하고 sleep 명령어를 백그라운드로 실행한다.

# useradd procuser

# su - procuser

$ sleep 1000  &

[1] 5046 ----> [작업번호] PID


$ jobs  ---> 현재 백그라운드로 돌고 있는 프로세스를 보여준다.

[1]   Running                 sleep 1000 &

[2]-  Running                 sleep 1000 &

[3]+  Running                 sleep 1000 &


- 프로세스의 우선순위 낮추기(권한이 있다)

$ renice +5 5046          

5046: old priority 0, new priority 5

$ renice +7 5046

5046: old priority 5, new priority 7


- 프로세스의 우선순위 높히기 (권한이 없다)

$ renice +1 5046

renice: 5046: setpriority: Permission denied


* 작업번호로 프로세스 종료하기

#kill -9 %백그라운드작업번호

=========================================================================


=========================================================================

PROC-LAB> 프로세스의 우선순위 범위 확인하기

참고 사이트 : 

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/Book_LSP/ch05_Process


# sleep 200 &

[1] 12911


# renice -200 12911

12911: old priority 0, new priority -20           ====> 범위안의 최소값으로 변경


# renice -21 12911

12911: old priority -20, new priority -20


# renice +200 12911

12911: old priority -20, new priority 19        ====> 범위안의 최대값으로 변경


# renice +21 12911


12911: old priority 19, new priority 19

=========================================================================



o 데몬 프로세스

데몬 프로세스는 백그라운드로 동작하면서 외부의 요청에 응답하는

프로세스이거나 특정 서비스를 실행시켜주는 프로세스


/etc/rc.d/init.d  : 데몬프로세스들을 실행시키는 스크립트가 모여있는 디렉토리

/usr/sbin/crond : 스케줄 작업을 하는 데몬 프로그램 

/etc/rc.d/init.d/crond  start : crond 실행 (crond 데몬을 실행시키는 스크립트)

/etc/init.d/crond  start : crond 실행 (crond 데몬을 실행시키는 스크립트)


/etc/rc.d/init.d/crond  stop  : crond 중지

/etc/init.d/crond  stop  : crond 중지


/etc/rc.d/init.d/crond  restart : crond 중지 -> 실행

/etc/init.d/crond  restart : crond 중지 -> 실행


/etc/init.d 디렉토리가 /etc/rc.d/init.d 에 심볼릭 링크되어 있다. 


# cd /etc/rc.d

# ls -l

drwxr-xr-x 2 root root  4096 Mar 12 17:13 init.d/

  :

  :

# ls -ld /etc/init.d  <-- 다른 리눅스와의 호환성을 위해서다.

lrwxrwxrwx 1 root root 11 Feb 11 18:38 /etc/init.d -> rc.d/init.d



=========================================================================

PROC-LAB> crond 데몬 프로그램을 실행해보자.


crond 데몬

 스케줄링하는 데몬

 백업을 새벽시간에 설정해서 등록하면 그 시간에 알아서 자동으로 백업한다


- windows 서비스 : services.msc

- linux 서비스   : ntsysv, chkconfig 


# /etc/init.d/crond 

Usage: /etc/init.d/crond {start|stop|status|reload|restart|condrestart}

===> 뒤에 인자를 주지 않을 경우 사용법을 출력해준다.


# /etc/init.d/crond restart

Stopping crond:                                            [  OK  ]

Starting crond:                                            [  OK  ]


# ps aux | grep crond

root      5452  0.0  0.2   5392  1104 ?        Ss   00:10   0:00 crond


- /etc/init.d/crond 의 스크립트 파일을 확인한다.

# ls -l /etc/init.d/crond

-rwxr-xr-x 1 root root 1926 Feb 23  2012 /etc/init.d/crond*


# ls -l /usr/sbin/crond   <-- 실제 데몬 프로그램

-rwxr-xr-x 1 root root 313832 Feb 23  2012 /usr/sbin/crond*



# /etc/crontab 의 내용

# 환경변수 세팅

# 스케줄 작업 내용 세팅

# 42  4  1  *   *   root   run-parts

# ~~ ~~ ~~ ~~  ~~   ~~~~   ~~~~~~~~~

# 분 시 일 월 요일  사용자 실행파일

===> 요일에 상관없이 매월 1일 4시 42분에 root사용자로 run-parts를 실행해라.


# vi /etc/crontab

-- /etc/crontab --

  :

  :

* * * * *  root  date >> /tmp/date.txt   <-- 추가


-- /etc/crontab --


- time.bora.net 의 타임서버에서 날짜와 시간을 가져와서 시스템에 세팅한다.

# rdate -s time.bora.net

- /tmp/date.txt 파일을 실시간으로 모니터링한다. (tail -f , 로그를 모니터링할 때 자주 사용한다.)

# tail -f  /tmp/date.txt

Fri Mar 14 14:47:21 KST 2014

Fri Mar 14 14:48:01 KST 2014

  :

  :

=========================================================================


=========================================================================

o /proc 디렉토리 (가상파일시스템)

- 메모리의 있는 내용을 디렉토리로 보여준다.  


# ls  /proc

1     1225  1946  21735  2452   303        cmdline      kallsyms    scsi

10    1228  1952  2190   2453   310        cpuinfo      kcore       self

1039  1231  1988  21925  2454   3141       crypto       keys        slabinfo

1040  1234  2     2228   2465   319        devices      key-users   stat

11    1249  2018  2254   2467   349        diskstats    kmsg        swaps

1172  1255  2034  2272   25375  382        dma          loadavg     sys

118   1256  2047  2299   271    4          driver       locks       sysrq-trigger

119   1338  2058  2310   27446  48         execdomains  mdstat      sysvipc

120   1567  2072  2324   27450  5          fb           meminfo     tty

1200  1734  2115  2362   28552  51         filesystems  misc        uptime

1206  1793  2129  2387   28982  53         fs           modules     version

121   1795  2146  2413   297    6          ide          mounts      vmcore

1216  1816  2147  2414   298    7          interrupts   mtrr        vmstat

122   1829  2154  2446   3      acpi       iomem        net         zoneinfo

1223  1832  2158  2450   301    buddyinfo  ioports      partitions

1224  1912  2168  2451   302    bus        irq          schedstat


- PID 303 프로세스를 확인해보자.

# ps aux | grep 303

root       303  0.0  0.0      0     0 ?        S<   Jul20   0:00 [scsi_eh_2]

root     28984  0.0  0.2   4020   696 pts/0    R+   17:09   0:00 grep --color 303  

===>순간적으로 메모리에 올라가있기 때문에 보이지만 메모리상에서는 내려간 상태

# ps aux | grep 2146

68        2146  0.0  1.5   5852  3944 ?        Ss   Jul20   0:00 hald

root     28986  0.0  0.2   4020   696 pts/0    R+   17:09   0:00 grep --color 2146


- PID 28552 프로세스를 확인해보자.

# ps aux | grep crond

root     28552  0.0  0.4   5388  1212 ?        Ss   16:30   0:00 crond

root     28993  0.0  0.2   4020   704 pts/0    R+   17:10   0:00 grep --color cron


- PID 28552 프로세스를 종료하고 다시보면 /proc/28552 디렉토리가 

  없는걸 알 수 있다. ===> 이는 프로세스가 종료했다는 것을 의미한다.

# /etc/init.d/crond stop

Stopping crond:                                            [  OK  ]

# ps aux | grep crond

root     29001  0.0  0.2   4020   696 pts/0    R+   17:10   0:00 grep --color cron

# ls  /proc

1     1225  1946  21735  2452   310        cpuinfo      kcore       self

10    1228  1952  2190   2453   3141       crypto       keys        slabinfo

1039  1231  1988  21925  2454   319        devices      key-users   stat

1040  1234  2     2228   2465   349        diskstats    kmsg        swaps

11    1249  2018  2254   2467   382        dma          loadavg     sys

1172  1255  2034  2272   25375  4          driver       locks       sysrq-trigger

118   1256  2047  2299   271    48         execdomains  mdstat      sysvipc

119   1338  2058  2310   27446  5          fb           meminfo     tty

120   1567  2072  2324   27450  51         filesystems  misc        uptime

1200  1734  2115  2362   29002  53         fs           modules     version

1206  1793  2129  2387   297    6          ide          mounts      vmcore

121   1795  2146  2413   298    7          interrupts   mtrr        vmstat

1216  1816  2147  2414   3      acpi       iomem        net         zoneinfo

122   1829  2154  2446   301    buddyinfo  ioports      partitions

1223  1832  2158  2450   302    bus        irq          schedstat

1224  1912  2168  2451   303    cmdline    kallsyms     scsi

=========================================================================


=========================================================================

PROC-LAB> PID 순환 확인 (!!! 중요하다 !!!)

운영체제가 프로그램을 실행시키면 각 프로세스마다 번호를 부여하고 프로세스를 관리한다.


- 쉘스크립트를 작성하는 능력이 필요하다.

- touch proctest.sh -> chmod 755 proctest.sh 

- install /dev/null proctest.sh   <--- 755로 파일이 생성


- cd /etc/init.d -> ./crond start

- /etc/init.d/crond start


# install /dev/null proctest.sh  <-- 755 로 생성된다.

# vi proctest.sh

-- proctest.sh --

#!/bin/sh


echo $$                  //  $$ : 프로세스 번호를 의미

-- proctest.sh --


# while : 

> do

>    ./proctest.sh 

> done


  :

  :

32764

32765

32766

32767   <-- 마지막 PID

300     <-- 처음 PID

304

305

306

307

308

  :

  :

- pid 의 갯수가 이 파일에 들어있다.

# cat /proc/sys/kernel/pid_max ( 현재 돌아가고 있는 커널을 수정할 수는 있지만 삭제는 할 수 없다)

32768    ===> 0부터 32767까지의 총 32768개의 숫자가 이 파일에 들어있다.

# echo 20000 > /proc/sys/kernel/pid_max 

  :

  :

19997

19998

19999

300

304

305

  :

  :

- 원래 값으로 변경한다.

#sysctl -w kernel.pid_max=32768  

/proc/sys/kernel/pid_max   ===> 앞의 /proc/sys는 생략하고 쓴다.

=========================================================================


=========================================================================

PROC-LAB> 프로세스를 /proc 에서 확인하기


- 윈도우즈에서 ping 은 4번 이다.

- 리눅스에서 ping 은 무한루프다.


# ping 192.168.56.1

PING 192.168.56.1 (192.168.56.1) 56(84) bytes of data.

64 bytes from 192.168.56.1: icmp_seq=1 ttl=128 time=0.515 ms

64 bytes from 192.168.56.1: icmp_seq=2 ttl=128 time=0.326 ms

64 bytes from 192.168.56.1: icmp_seq=3 ttl=128 time=0.283 ms

64 bytes from 192.168.56.1: icmp_seq=4 ttl=128 time=0.327 ms


--- 192.168.56.1 ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3038ms

rtt min/avg/max/mdev = 0.283/0.362/0.515/0.092 ms

# ping -c 3 localhost

PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.

64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.050 ms

64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=64 time=0.020 ms

64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=64 time=0.041 ms


--- localhost.localdomain ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2044ms

rtt min/avg/max/mdev = 0.020/0.037/0.050/0.012 ms

[root@WhiteHacker ~]# 

# cat /proc/sys/net/ipv4/ip_default_ttl 

64

# echo 128 > /proc/sys/net/ipv4/ip_default_ttl 

# ping -c 3 localhost

PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.

64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=128 time=0.019 ms

64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=128 time=0.020 ms

64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=128 time=0.054 ms


--- localhost.localdomain ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2031ms

rtt min/avg/max/mdev = 0.019/0.031/0.054/0.016 ms

[root@WhiteHacker ~]# cat /proc/sys/net/ipv4/ip_default_ttl 

128



sysctl 명령어를 이용해서 ttl 값을 64로 복구해보자.

파일명 : /proc/sys/net/ipv4/ip_default_ttl


#sysctl -w net.ipv4.ip_default_ttl=64

/proc/sys/net/ipv4/ip_default_ttl  ===> 앞의 /proc/sys는 생략하고 쓴다.

============================================================================


============================================================================

LAB> 자식 프로세스 생성하기

!!! 프로그램을 생성하고 실행하면 프로세스가 된다 !!!

#vi process1.c

-- process1.c--

#include<stdio.h>

#include<unistd.h>

int main()

{

  sleep(100);

  return 0;

}

-- process1.c--


# gcc -o process1 process1.c

# ./process1 &

[1] 1840

# ps aux | grep process1

root      1840  0.0  0.1   1608   268 pts/0    S    12:47   0:00 ./process1

root      1848  0.0  0.2   4016   692 pts/0    R+   12:47   0:00 grep process1

# kill 1840

# ps aux | grep process1

root      1853  0.0  0.2   4016   692 pts/0    R+   12:48   0:00 grep process1

[1]+  Terminated              ./process1

============================================================================


============================================================================

LAB> 자식 프로세스 생성하기2

!!! 자식프로세스가 생성되는 것이 중요 !!!

#vi process2.c

-- process2.c--

#include<stdio.h>

#include<unistd.h>

int main()

{

  fork();

  sleep(100);

  return 0;

}

-- process2.c--


# gcc -o process2 process2.c

# ./process2&

[1] 1925

# ps -ef | egrep 'PID|process'            //   -ef : 자식 프로세스와 부모 프로세스의 번호를 확인하기 위해 사용

UID        PID  PPID  C STIME TTY          TIME CMD

root      1925  2113  0 12:56 pts/0    00:00:00 ./process2

root      1926  1925  0 12:56 pts/0    00:00:00 ./process2

root      1928  2113  0 12:57 pts/0    00:00:00 egrep PID|process

===> 부모 프로세스인 PID(1925)의 자식 프로세스 PID(1926)

============================================================================


============================================================================

LAB> 자식 프로세스 생성하기3

!!! 한 프로세스 내에서 부모프로세스와 자식프로세스가 생성되고 각각 실행되는 것이 중요 !!!

!!! 자식프로세스는 부모프로세스의 자원을 공유한다 !!!

-- process3.c--

#include<stdio.h>

#include<unistd.h> 

#include<sys/types.h> 

int main() {

  pid_t pid; // 프로세스가 담길 변수 pid 선언 

  int i; // 변수 i 선언

  i = 20; // i 변수에 20을 대입

  pid = fork();                // fork()를 하기전에 선언한 i 값을 물려받기 때문에 자식 프로세스 번호가 출력된다

  if(pid > 0) {

    printf("Parent Process : %d \n", i+1);

  }

  else if(pid == 0) {

    printf("Child Process : %d \n", i-1);

  }

  else {

    printf("fork() failed!! \n");

  }

  return 0;

}

-- process3.c--

# gcc -o process3 process3.c
# ./process3
Child Process : 19 
Parent Process : 21 
===> child가 먼저 출력되는 이유 : 자식프로세스의 종료 후 부모 프로세스가 종료되기 때문이다.

============================================================================


============================================================================

LAB> 프로세스 생성하기4 (자식프로세스 생성)

!!! 자식프로세스는 부모프로세스의 자원을 물려받는다. !!!


# vi process4.c

-- process4.c --

#include <stdio.h>      // FILE, fopen, fprintf

#include <sys/types.h>  // pid_t

#include <unistd.h>     // fork(), sleep()

#include <stdlib.h>     // exit

int main()

{

  FILE *fp;      // 파일포인터 fp 변수 선언

  pid_t pid;     // 프로세스가 담길 변수 pid 선언


  // /etc/passwd 파일을 읽기 전용으로 연다.

  fp = fopen("/etc/passwd", "r");    // fork 하기 전에 파일을 열었다


  pid = fork();  // 자식 프로세스 생성


  // fork() 실패시 에러를 출력하고 프로그램을 종료한다.

  if(pid == -1)

  {

    fprintf(stderr, "fork error! \n"); // 화면에 에러 출력

    exit(1);  // 프로그램 종료

  }

  

  sleep(100);  // 100초 동안 sleep 상태

  fclose(fp);  // /etc/passwd 파일을 닫는다.


  return 0;

}

-- process4.c --


# gcc -o process4 process4.c


# ./process4&

[1] 30278

# ps -ef | egrep 'PID|process'

UID        PID  PPID  C STIME TTY          TIME CMD

root     30278 18425  0 09:41 pts/2    00:00:00 ./process4

root     30279 30278  0 09:41 pts/2    00:00:00 ./process4

root     30281 18425  0 09:41 pts/2    00:00:00 egrep PID|process


# ls -l /proc/30278/fd

total 0

lrwx------ 1 root root 64 Apr 18 09:41 0 -> /dev/pts/2

lrwx------ 1 root root 64 Apr 18 09:41 1 -> /dev/pts/2

lrwx------ 1 root root 64 Apr 18 09:41 2 -> /dev/pts/2

lr-x------ 1 root root 64 Apr 18 09:41 3 -> /etc/passwd     <--- 부모가 passwd 를 열었다


# ls -l /proc/30279/fd

total 0

lrwx------ 1 root root 64 Apr 18 09:41 0 -> /dev/pts/2

lrwx------ 1 root root 64 Apr 18 09:41 1 -> /dev/pts/2

lrwx------ 1 root root 64 Apr 18 09:41 2 -> /dev/pts/2

lr-x------ 1 root root 64 Apr 18 09:41 3 -> /etc/passwd   <--- 자식은 열지 않았지만 

                                                                          부모의 자원을 물려받았기 때문에 열림

리눅스 파일디스크립터 검색

0 : standard input  (STDIN)  입력 키보드 

1 : standard output (STDOUT) 정상출력 모니터

2 : standard error  (STDERR) 에러출력 모니터

3 : 일반 파일

0, 1, 2 번호는 예약된 번호로 일반적으로 파일을 열면 3번으로 확인 된다.

0~2 는 프로세스를 실행하는 순간 무조건 만들어진다.


ex) # a;sdkfj;asdkfj;askdjfkasd;f 2> /dev/null   ----> 에러출력을 /dev/null 에 하라 (/dev/null은 쓰레기장 개념)

============================================================================


============================================================================
LAB> 프로세스 실행하기 ( exec 계열 함수 생성)

-- process5.c--
#include<stdio.h>
#include<unistd.h>

int main()
{
char command[] = "/usr/bin/top";
execl(command, "top", NULL);
return 0;
}
-- process5.c--

# gcc -o process5 process5.c
# ./process5

============================================================================


============================================================================
LAB> bash에서 명령어를 실행할 때 자식 프로세스의 관계

- bash 에서 fork() 형태로 명령어를 실행한다.
# ps
  PID TTY          TIME CMD
18425 pts/2    00:00:02 bash
30506 pts/2    00:00:00 ps

# sleep 100 &
[1] 30507

# ps -ef | egrep 'PID|sleep'
UID        PID  PPID  C STIME TTY          TIME CMD
root     30507 18425  0 10:32 pts/2    00:00:00 sleep 100
root     30509 18425  0 10:32 pts/2    00:00:00 egrep PID|sleep
# pstree -p | grep sleep
        |            |                           `-sleep(30507)
# pstree -p | egrep 'bash|sleep'
        |-login(2425)---bash(3213)
        |-sshd(2779)-+-sshd(18421)---bash(18425)-+-egrep(30516)
        |            |                           `-sleep(30507)


- bash 에서 fork() 형태가 아닌 바로 명령어로 대체해서 실행한다.
# exec ls
# vi process6.c
-- process6.c --
#include <unistd.h>  // sleep execl

int main()
{
  char command[] = "/bin/ls";
 
  execl(command, "ls", NULL);

  return 0;
}
-- process6.c --

# gcc -o process6 process6.c 
# exec ./process6 

logout

============================================================================


'Linux > 기타' 카테고리의 다른 글

사용자와 그룹  (0) 2015.04.24
프로세스#2  (0) 2015.04.23
퍼미션  (0) 2015.04.21
yum  (0) 2015.04.20
rpm  (0) 2015.04.17