본문 바로가기

Linux/1) 리눅스 기초 관리자 과정

14_ Process Administration (프로세스 관리) -(1)

1. 프로세스(process)란?

processor = CPU

process    = 실행중인 프로그램 

==> 프로세스(process)실행중인 프로그램

 

: 프로그램이 메모리에 적재되어 실제로 실행되고 있는 상태 (컴퓨터 내에서 실행중인 프로그램의 인스턴스)

: 모든 프로그램은 실행될 때 하나 이상의 프로세스를 가짐

: 각 프로세스는 고유의 권한과 책임을 가지고 서로 통신

: 시스템에서 동작 중인 하나의 프로세스가 에러가 발생하더라도 다른 프로세스는 정상적으로 작동

: 프로세스는 여러 자원을 사용

: 운영체제의 제어를 받으며 실행(running), 대기(waiting), 중단(stopped), 좀비(zombie) 중 한 상태에 있게 됨

 

1) 자식 프로세스 (Child Process) & 부모 프로세스 (Parent Process)

  • PID (Process Identification) : 프로세스가 시작할 때 할당받는 프로세스 식별번호
  • PPID (Parent Process Identification) : 부모 프로세스 식별번호 (서브 프로세스를 실행시킨 프로세스)

∇ ps 명령어 : 현재 실해중인 프로세스 목록과 상태를 보여줌

[root@server1 ~]# ps
    PID TTY          TIME CMD
   2925 pts/0    00:00:00 bash
   2963 pts/0    00:00:00 ps

 

∇ bash 쉘 추가 실행

∇ -f 옵션 : 풀 포맷으로 보여줌, 유닉스 스타일로 출력해주는 옵션으로 UID, PID, PPID 등이 함께 표시

[root@server1 ~]# bash
[root@server1 ~]# ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
root        2925    2914  0 17:24 pts/0    00:00:00 bash
root        3040    2925  3 17:27 pts/0    00:00:00 bash
root        3068    3040  2 17:27 pts/0    00:00:00 ps -f

 

∇ 현재 실행상태

         PID=2925

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

                        | PID=3040, PPID=2925

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

 

∇ -e 옵션 : 커널 프로세스를 제외한 모든 프로세스를 출력 

∇ more : 내용을 화면 단위로 끊어서 출력 (위에서 아래 방향으로만 출력)

[root@server1 ~]# ps -ef | more
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 17:03 ?        00:00:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root           2       0  0 17:03 ?        00:00:00 [kthreadd]
root           3       2  0 17:03 ?        00:00:00 [rcu_gp]
root           4       2  0 17:03 ?        00:00:00 [rcu_par_gp]
root           6       2  0 17:03 ?        00:00:00 [kworker/0:0H-kblockd]
root           9       2  0 17:03 ?        00:00:00 [mm_percpu_wq]
root          10       2  0 17:03 ?        00:00:00 [ksoftirqd/0]
root          11       2  0 17:03 ?        00:00:02 [rcu_sched]
root          12       2  0 17:03 ?        00:00:00 [migration/0]
root          13       2  0 17:03 ?        00:00:00 [watchdog/0]

위의 명령어 출력 결과 해석

  • root           UID           프로세스를 실행시킨 사용자
  • 1               PID           프로세스 아이디, 식별번호
  • 0               PPID         부모 프로세스 아이디
  • 0               C             현재 사용되지 않는 필드
  • 17:03         STIME       Start Time, 프로세스 실행 시작 시간
  •  ?              TTY          제어 터미널, 프로세스가 실행된 터미널
  • 00:00:06      TIME        CPU 사용 누적 시간
  • [kthreadd]    CMD       명령어 (옵션 + 인자 포함)

 

※ 데몬 (Daemon) 정의

: 시스템(System)을 위해 또는 서비스(Service)를 위해 백그라운드에서 동작하는 프로세스

: 커널상에서 백그라운드 모드로 작동해 비활성화 상태에서 요청이 있을  때만 동작하는 프로세스

: 백그라운드 모드로 실행되어 작동하지 않고 있을 때는 CPU에 부하를 주지 X, 메모리의 공간은 차지 O

  -> 데몬이 커널상에 많이 존재한다면 시스템의 자원을 많이 사용

 

ex) 웹 데몬        -> httpd

     메일 데몬     -> sendmail

     ftp 데몬       -> vsftpd

     telnet 데몬    -> telnetd

 

 

2. 프로세스의 정보 (Process Information)

1) 프로세스 정보가 존재하는 디렉토리

/prco 디렉토리에 각 프로세스에 해당되는 PID 디렉토리들이 있다 

 

∇ /proc라는 디렉토리는 커널 메모리를 마운트 한 것

[root@server1 ~]# ls /proc
1/      1736/  1944/   20974/  2324/  2651/  6/     945/         kpageflags
10/     174/   1947/   21/     2333/  2658/  613/   948/         loadavg
1000/   1740/  195/    21007/  2337/  27/    614/   949/         locks
1004/   175/   1950/   21041/  2341/  28/    617/   951/         mdstat
1007/   1758/  1959/   21043/  2350/  29/    618/   952/         meminfo
1008/   176/   196/    21099/  2352/  3/     619/   954/         misc
1009/   177/   1961/   2114/   2365/  31/    620/   956/         modules
1030/   178/   1964/   2119/   2367/  33/    621/   957/         mounts@
1052/   179/   197/    2127/   2368/  34/    622/   959/         mpt/
1053/   180/   1972/   21272/  2369/  35/    623/   971/         mtrr
11/     181/   1975/   21277/  2374/  38/    71/    977/         net@
-------------------------------------(중략)--------------------------------------

 

(확인실습)

[root@server1 ~]# gedit &				# 텍스트 편집기 실행
[1] 3349

[root@server1 ~]# ps					# ps 명령어로 현재 실행중인 프로세스 목록과 상태 확인
    PID TTY          TIME CMD
   2925 pts/0    00:00:00 bash
   3349 pts/0    00:00:05 gedit
   3387 pts/0    00:00:00 ps

[root@server1 ~]# ls -ld /proc/3349		# -l: 자세한 내용 출력, -d : 지정 경로에 있는 최상위 디렉토리만 출력
dr-xr-xr-x 9 root root 0  8월 17 17:51 /proc/3349/

[root@server1 ~]# ls -l /proc/3349		# /prco 디렉토리에 gedit에 해당되는 PID로 목록 확인
합계 0
dr-xr-xr-x 2 root root 0  8월 17 17:52 attr/
-rw-r--r-- 1 root root 0  8월 17 17:52 autogroup
-r-------- 1 root root 0  8월 17 17:52 auxv
-r--r--r-- 1 root root 0  8월 17 17:52 cgroup
--w------- 1 root root 0  8월 17 17:52 clear_refs
-r--r--r-- 1 root root 0  8월 17 17:51 cmdline
-rw-r--r-- 1 root root 0  8월 17 17:52 comm
-----------------(중략)----------------------

[root@server1 ~]# file /proc/3349/*		# file 명령어로 지정된 파일 타입 확인
/proc/3349: directory

---> gedit 툴 종료

[root@server1 ~]# ls -ld /proc/3349		# gedit 파일은 종료되었으니 디렉토리가 존재하지 않는다
ls: cannot access '/proc/3349': 그런 파일이나 디렉터리가 없습니다

 

3. 프로세스 관리 (백그라운드와 포그라운드 관리 - & , bg , fg , jobs)

  • 쉘 프롬프트에 명령어를 입력해 포그라운드 상태 ($ cat > testfile)로 프로그램을 실행 
  • --> 프로그램이 실행되는 동안 쉘 프롬프트를 볼 수 없음
  • <Ctrl + D>로 프로그램이 종료되어야 쉘 프롬프트 상태로 돌아온다
  • 백그라운드는 명령행 끝에 & (앰퍼샌드)를 붙여서 사용하면 쉘 프롬프트가 떨어지고 대신 프로세스는 사용자가 보지 않는 상태로 실행됨
  • 백그라운드 프로세스는 $  bg 명령어로 확인가능하고 $ fg 명령어로 포그라운드 전환이 가능 
  • --> 포그라운드로 돌아가는 중에 < Ctrl + Z> 로 멈추고 $ bg 명령을 내리면 됨 

프로그램 실행 형태

1) 프로세스 실행

∇ 프로그램 실행 형태

(fg) # ls 		(# gedit)
(bg) # ls & 		(# gedit &)

 

∇ (fg 형태로 프로그램이 실행되면)

 # gedit

-> 명령어 창으로 돌아와서 'ls' 명령어를 수행했을 때 명령어의 출력 결과과 보이지 X

-> 부모 프로세스(bash)가 종료되면 자식 프로세스가 종료됨

[root@server1 ~]# ps
    PID TTY          TIME CMD
   2925 pts/0    00:00:00 bash
   
[root@server1 ~]# gedit
ls

 

∇ (bg 형태로 프로그램이 실행되면)

-> 명령어 창으로 돌아와서 'ls' 명령어를 수행하면 정상적으로 수행됨

-> 부모 프로세스(bash)가 종료되었다고 해서 자식 프로세스가 종료 되지 않음

[root@server1 ~]# ps
    PID TTY          TIME CMD
   2925 pts/0    00:00:00 bash

[root@server1 ~]# gedit &
[1] 3948

[root@server1 ~]# ls
UTF-8	anaconda-ks.cfg		bin/	initial-setup-ks.cfg
공개/		다운로드/		문서/		바탕화면/
비디오/	사진/			서식/			음악/

 

- 프로그램 실행 실습 -

[root@server1 ~]# cat &				# 백그라운드 상태로 프로세스를 실행
[1] 2886					# [1] : 잡 아이디(Job ID), 2886 : 프로세스 아이디(PID)

[1]+  Stopped                 cat

[root@server1 ~]# ps -ef | grep cat		# ps는 프로세스의 현재 상태를 보여주는 명령어, -e : 커널 ㅍ로세스를 제외한 모든 프로세스 보여줌, -f : CMD필드의 전체 명령어 형태를 보여줌
gdm         2035    1528  0 22:24 tty1     00:00:00 /usr/libexec/gsd-print-notifications
root        2459    2243  0 22:27 tty2     00:00:00 /usr/libexec/gsd-print-notifications
root        2645    2243  4 22:27 tty2     00:00:06 /usr/bin/gnome-software --gapplication-service
root        2886    2833  0 22:29 pts/0    00:00:00 cat
root        2894    2833  0 22:29 pts/0    00:00:00 grep --color=auto cat

[root@server1 ~]# ls -ld /proc/2886		# 지정경로에 있는 최상위 디렉토리만 자세하게 출력
dr-xr-xr-x 9 root root 0  8월 17 22:29 /proc/2886/

[root@server1 ~]# fg				# 백그라운드 -> 포그라운드로 전환
cat
^C						# 포그라운드 상태의 프로세스를 종료

[root@server1 ~]# ls -ld /proc/2886		# 지워진 것을 확인
ls: cannot access '/proc/2886': 그런 파일이나 디렉터리가 없습니다

 

2) 프로세스 정보 확인

 

∇ 명령어 형식

# ps           : 현재 터미널에서 실행된 프로세스의 간략한 정보 확인

# ps -l        : 현재 터미널에서 실행된 프로세스의 자세한 정보 확인

# ps -a       : 사용자 프로세스에 대한 간략한 정보 확인

# ps -U       : # ps -U user01, # ps -U user01, user02, user03)

                 : 특정한 사용자가 실행시킨 프로세스의 간략한 정보 확인

# ps -t pts/5 : 특정한 터미널에서 실행시킨 프로세스의 간략한 정보 확인

 

[root@server1 ~]# ps aux | grep rsyslogd
root        1111  0.0  0.3 209460  6052 ?        Ssl  22:24   0:00 /usr/sbin/rsyslogd -n
root        3531  0.0  0.0  10568  1148 pts/0    S+   23:26   0:00 grep --color=auto rsyslogd

[root@server1 ~]# ps -ef | grep rsyslogd
root        1111       1  0 22:24 ?        00:00:00 /usr/sbin/rsyslogd -n
root        3539    3449  0 23:26 pts/0    00:00:00 grep --color=auto rsyslogd

 

∇ 명령어 옵션

옵션 내용
- e 모든 프로세스 리스트를 출력
- f 프로세스 시작시간, 프로세스의 부모 ID, 그 프로세스에 관련된 사용자 ID, 명령 이름과 가능한 매개변수 등 모든 정보를 출력 (full format)
- l 자세한 정보 보기
-p (pid) 지정된 프로세스에 대한 정보 출력
- t (tty) 지정된 터미널에 연관된 프로세스에 대한 정보 출력
-u (uid) 지정된 사용자에 연관된 프로세스에 대한 정보 출력
a 다른 사용자의 프로세스 상태도 표시
x 화면에 보이지 않는 프로세스까지 모두 표시

 

∇ ps 명령어 실습

# ps  : 자신을 포함해 자신이 실행한 프로세스를 확인

[root@server1 ~]# ps		
    PID TTY          TIME CMD
   3449 pts/0    00:00:00 bash
   3622 pts/0    00:00:00 ps

 

# ps -U root : root 사용자가 사용하는 프로세스 정보를 보여줌

[root@server1 ~]# ps -U root
    PID TTY          TIME CMD
      1 ?        00:00:07 systemd
      2 ?        00:00:00 kthreadd
      3 ?        00:00:00 rcu_gp
      4 ?        00:00:00 rcu_par_gp
      6 ?        00:00:00 kworker/0:0H-kblockd
      9 ?        00:00:00 mm_percpu_wq
----------------(중략)--------------------------

 

# ps : 현재 터미널에서 실행된 프로세스의 간략한 정보 확인

[root@server1 ~]# ps
    PID TTY          TIME CMD
   3758 pts/2    00:00:00 bash
   3792 pts/2    00:00:00 ps

 

# ps -t pts/2 : 터미널창 번호를 확인한 후에 해당 터미널의 프로세스 정보를 확인

[root@server1 ~]# ps -t pts/2
    PID TTY          TIME CMD
   3758 pts/2    00:00:00 bash

 

# ps a : 다른 사용자의 프로세스 상태도 표시

# ps -ef | less : 모든 프로세스 리스트를 출력하면서 모든 정보를 함께 출력함

# ps aux | less  : a = 다른 사용자의 프로세스 상태도 표시

                      x = 화면에 보이지 않는 프로세스까지 모두 표시

                      u = 프로세스를 사용한 사용자와 실행 시간까지 표시

[root@server1 ~]# ps aux | less
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.1  0.5 242996 10432 ?        Ss   22:23   0:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
root           2  0.0  0.0      0     0 ?        S    22:23   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   22:23   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   22:23   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   22:23   0:00 [kworker/0:0H-kblockd]
root           9  0.0  0.0      0     0 ?        I<   22:23   0:00 [mm_percpu_wq]
root          10  0.0  0.0      0     0 ?        S    22:23   0:00 [ksoftirqd/0]
root          11  0.0  0.0      0     0 ?        I    22:23   0:03 [rcu_sched]

- USER : 프로세스 소유자의 이름 (u 옵션)

- PID : 프로세스 식별자 번호

- % CPU : 마지막 1분 동안 프로세스가 사용한 CPU 점유율 (u 옵션)

- % MAN : 마지막 1분 동안 프로세스가 사용한 메모리의 점유율 (u, v 옵션)

- VSZ : 가상 메모리에 적재된 프로세스의 kb 단위 크기

- START : 프로세스가 시작된 상태

- STAT : 필드의 상태

  • - D : 디스크 입출력 대기 상태, interrupts를 걸 수 없는 상태
  • - R : 실행중
  • - S : 짧은 sleep 상태
  • - T : 정지 상태
  • - Z : 좀비 상태
  • - W : 상주한 페이지가 없는 프로세스
  • - < : 높은 우선권 프로세스
  • - N : 낮은 우선권 프로세스
  • - L : 페이지가 lock이 걸린 상태  

 

※ 좀비(Zombie) 프로세스

: fork를 이용한 프로세스 생성은 유용하나, 실행이 종료됐지만 부모와의 연관관계가 아직 남아있는 프로세스를 가리켜 소멸된 프로세스를 좀비 프로세스라 부른다

: 실행 시 뒤에 '&'를 붙여 백그라운드 작업 후 부모 프로세스가 끝나기 전에 ps 명령어를 실행시키면 <defunct>라고 나오며, 이것이 좀비 프로세스

 

∇ 프로그램 실행

- 1번 실행창 -

[root@server1 ~/bin]# cat fork2.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
	pid_t pid;
	char *message;
	int n;

	printf("fork program starting\n");
	pid = fork();
	switch(pid)
	{
	case -1:
		perror("fork failed");
		exit(1);
	case 0:
		message = "This is the child";
		n = 3;
		break;
	default:
		message = "This is the parent";
		n = 5;
		break;
	}

	for(;n > 0;n--) 
	{
		puts(message);
		sleep(1);
	}
	printf("fork program : ending\n");
	exit(0);
}

# gcc -o fork2 fork2.c

 

# tty : 현재 세션 확인

root@server1 ~/bin]# tty
/dev/pts/0

 

# vi mon.sh

[root@server1 ~/bin]# cat mon.sh
#!/bin/bash

> ps.log

while true
do
        echo "------------`date`------------" | tee -a ps.log
        ps -l -t pts/1 | tee -a ps.log
        sleep 1
done

 

# chmod 755 mon.sh : 파일 권한 변경

 

- 2번 실행창 -

[root@server1 ~]#  while true
> do
> echo "-----------`date`--------" | tee -a ps.log
> ps -l -t pts/0 | tee -a ps.log
> sleep 1
> done

 

- 1번 실행창 - 

# ./fork2 &

[root@server1 ~/bin]# ./fork2 &
[1] 5311
fork program starting
This is the parent
This is the child
This is the parent
This is the child
This is the parent
This is the child
This is the parent
fork program : ending
This is the parent
fork program : ending

 

 - 2번 실행창 - 

<CTRL + C> : 프로그램을 종료하고 ps.log 파일 분석

# cat ps.log : 프로그램이 종료하기 전에 프로세스의 상태 정보를 확인 (내용 분석)

-----------2021. 08. 18. (수) 00:18:40 KST--------
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    3449    3444  0  80   0 -  6560 core_s pts/0    00:00:00 bash
0 S     0    4944    3449  0  80   0 -  1088 hrtime pts/0    00:00:00 fork2
1 S     0    4947    4944  0  80   0 -  1088 hrtime pts/0    00:00:00 fork2
-----------2021. 08. 18. (수) 00:18:41 KST--------
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    3449    3444  0  80   0 -  6560 core_s pts/0    00:00:00 bash
0 S     0    4944    3449  0  80   0 -  1088 hrtime pts/0    00:00:00 fork2
1 S     0    4947    4944  0  80   0 -  1088 hrtime pts/0    00:00:00 fork2
-----------2021. 08. 18. (수) 00:18:42 KST--------
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    3449    3444  0  80   0 -  6560 core_s pts/0    00:00:00 bash
0 S     0    4944    3449  0  80   0 -  1088 hrtime pts/0    00:00:00 fork2
1 Z     0    4947    4944  0  80   0 -     0 -      pts/0    00:00:00 fork2 <defunct>
-----------2021. 08. 18. (수) 00:18:44 KST--------
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    3449    3444  0  80   0 -  6560 core_s pts/0    00:00:00 bash
0 S     0    4944    3449  0  80   0 -  1088 hrtime pts/0    00:00:00 fork2
1 Z     0    4947    4944  0  80   0 -     0 -      pts/0    00:00:00 fork2 <defunct>
-----------2021. 08. 18. (수) 00:18:45 KST--------
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    3449    3444  0  80   0 -  6560 core_s pts/0    00:00:00 bash
-----------2021. 08. 18. (수) 00:18:46 KST--------
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    3449    3444  0  80   0 -  6560 core_s pts/0    00:00:00 bash