http://192.168.0.43:2015/
userid : boan
passwd : boan2015
주제 : 프로세스
o 프로세스란 ?
- 프로세스는 실행중인 프로그램이다.
- 프로그램은 하드디스크에 파일형태로 저장되어 있다.
- 프로그램은 실행 시에 프로세스를 어떻게 만들지에 대한 광범위한 정보를 담고있는 파일이다.
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
============================================================================
============================================================================
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;
}
============================================================================
============================================================================
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은 쓰레기장 개념)
============================================================================