I. Process 관련 명령어

  • ps, pgrep
  • kill, pkill
  • Job control
  • top

 

###1. ps

##1.process status

ps: 현재 세션의 프로세스들을 보여줌.

PID: 프로세스 ID

TTY: terminal ID

TIME: CPU 시간(cpu 점유했던 시간 누적값) <-> ETIME(elapsed time, 현실 세계 시간)

CMD: command , 프로세스 이름 ( argv[0] 만 보여준다.)

 

##2.ps -  all processes

ps -e :  전체 프로세스들 상태 보여줌

ps -a : 세션 리더들, 터미널과 연관된 프로세스들 제외한 나머지 프로세스들 상태 보여줌

 

##3. ps - full-format

ps -f : format이 이전 e,a 에비해 늘어남 

 

UID: 해당 프로세스의 소유권자 ID(User ID)

PID: 프로세스 ID

PPID: 부모 프로세스 ID(Parent PID)

C: CPU 사용량

STIME: 프로세스를 시작한 시간(시:분)  [현실세계 시간]

TTY: Terminal ID

TIME: CPU 시간(누적시간)

 

#4. ps: long-format

F: 프로세스 플래그

S: 상태코드(State code)

PRI: 실시간 우선순위(real time priority)

NI: 나이스 우선순위(Nice) , 사용가능 범위 : -20~19(음수일수록 우선순위 높음, default 값 0)

SZ: 사용되는 프로세스 코어 이미지의 메모리 크기 (KB)

C: CPU Usages =>  cpu사용량,  현재 사용량이 아닌 누적된 수치의 퍼센트 (cpu time / elapsed time)* 100

 

#5 조합(초급자들이 주로 사용)

ps: all ,long, full

ps -el (all, flong)

ps -ef (all, full)

ps -ej (all, jobs [pid, pgid, sid, tty])

 

#5-2 조합 (BSD, SysV 스타일)

1. UNIX 표준화 후 2가지 옵션 지원

1) ps axf

=>BSD style

2) ps -e --forest

=>UNIX SysV style

 

2.man ps 참조

(UNIX SysV, BSD, GNU style)

 

**1. UNIX는 AT&T 의 유닉스

 

1. UNIX 예제

2. BSD 예제

 

 

**grep <name>  name에 들어가는 행만 뽑아냄. 

 

 

#5 실력자들이 특정 단어를 찾는 방법 

jlim@jlim-vm:~$ alias pscpu='ps -eo s,pid,ucmd:12,etime,pcpu,time,pmem,rss --sort=-time,-pcpi | head'
jlim@jlim-vm:~$ alias psmem='ps -eo s,pid,ucmd:12,etime,pcpu,time,pmem,rss --sort=-pmem,-rss | head'

pscpu

이거에 대해 향후 공부해보자 ( 실행 시 되지 않네)

 

alias 만드는 법과 .bashrc 나 .bash_aliases에 넣어두어서 사용하면 장문 쓸 필요없음(bash shell 부분)

 

 


II. Process control 1

  • kill: send signal
  • UNIX Signal

##1 kill

#1 kill 명령어는 프로세스를 죽이는 명령보단, 프로세스에 시그널을 전송하는 기능이다.

kill -l  명령으로 signal 종류 확인 가능

 

빨: 중요, 초록: 그럭저럭 중요

 

#2 유닉스 시그널

  • SIGHUP: Hang Up
  • SIGINT: Interrupt <Ctrl-C>
  • SIGQUIT: Quit <Ctrl-\>
  • SIGKILL: kill
  • SIGSEGV: Segment violation
  • SIGTERM: Terminate
  • SIGTSTP: Temporary Stop

core dump (메모리 상태 덤프) 여부에 따라 SIGQUIT인지 SIGINT인지 구분한다.

core dump하는게 SIGQUIT.

SIGKILL은 강제로 죽이는 KILL이다. 

SIGTERM 프로세스에게 죽어달라 요청하지만, 이 요청을 거부하면 최후 수단으로 강제로 죽이는 경우가 있는데, 이는  시스템내에서 기록하고 있던 파일이 깨질 수 있는 위험이 있다.

SIGSEGV:(SEGV:Segement Violation)   프로그램이 이상작동으로 메모리 침범으로 죽은 것.

SIGTSTP: Ctrl-Z 인터럽트로 발생, 잠시 멈추게하는 경우다.

명령어 예시 설명
kill 13011 PID 13011 프로세스에 SIGTERM 시그널 보냄
kill -QUIT 13013 PID 13013 프로세스에 SIGQUIT 시그널 보냄
kill -9 13012 (== kill -KILL 13012) PID 13012 프로세스에 9번 시그널(SIGKILL) 보냄

숫자나 이름으로 signal 명령어 타이핑하는데 SIG는 생략.

 

SIGKILL은 최후의 수단으로 되도록 쓰면 안됨!!!

 

프로그램 종료 시킬때 SIGTERM, SIGINT, SIGQUIT 등 다른 방법으로 해결하고 안되면 SIGKILL

터미널1번

less ~/.bashrc

터미널2번

ps -e | grep less
kill PSID번호

터미널1번과 2번을 켜놓은 상태에서 각 위 명령어를 적어두면 2번에 의해 1번이 실행중인 less 프로세스가 종료됨을 확인할 수 있다.

 


III. Process control

  • Job control : fg, bg
  • foreground, background 정의
  • session, controlling terminal

##1.  Job control: fore/back-ground process

#1. fore-ground process

1)  현재 session 에서 제어터미널(controlling terminal)을 가진 프로세스

#2. back ground process

1) 현재 session에서 제어터미널을 잃어버린 프로세스

 

#3. Ctrl -Z

1) SIGTSTP(Signal - Temporary Stop) 시그널을 fore- gorund   프로세스에 전달

2) 작동: 잠시 정지시킴 = 결과적으로 back-ground에  Stopped 상태가 됨

 

#4. 세션(Session)

- 세션이란?

컴퓨터 과학에서, 특히 네트워크 분야에서 반영구적이고 상호작용적인 정보 교환을 전제하는 둘 이상의 통신 장치나 컴퓨터와 사용자 간의 대화나 송수신 연결상태를 의미하는 보안적인 다이얼로그 및 시간대를 가리킨다  -위키피디아-

 

1) 세션은 제어 터미널을 가질 수 있다.(option이라 없을 수도 있다)

2) SID == PID 세션 아이디와 프로세스 아이디가 같은 프로세스는 Session 리더라 부름.

세션 리더로부터 나온 자식프로세스들은 모두 같은 세션을 가지고 있어 로그아웃 시 해당 프로세스 SID들을 모두 파괴된다.

 

#5 제어터미널

1)사용자 제어(키보드 입력) 를 받는 터미널 장치 

 제어터미널에선 프로세스 소유를 최대 1개밖에 소유 못한다. 그래서 하나의 세션에 Fore ground process 는 최대 하나 존재한다.

 

 

#6 제어 터미널 규격

1) pts/# :  가짜 터미널  UNIX98 Pseudo terminal system

2) tty# : 진짜 터미널 (ctrl f2~f6)   

#7 Session에서 제어  터미널 가지지 않는 경우 ps의 TTY필드에 ? 로 나타남.

- ps -e | less 확인하기.

#7  Process Group(세션 리더의 PID 값 == Process Group ID)

session 만들어지고 명령을 내리면 명령 내린 프로세스의 계층에 그룹이 만들어진다.

프로세스 그룹 리더는 시그널 전파 기능을 가진다.

kill -USR1 -14901    PID 값이 -라고 되있으면  프로세스 그룹 ID (== PID)이다. 그럼 ) 그룹에 포함된 자식 프로세스들도  Kill 된다.

 

** 시스템 구성 중 세션은 제어 터미널을 갖을 수 있고, 해당 세션안에 복수의 프로세스 그룹이 존재;.

#8 daemon 프로세스

1) Orphan process

2) stdio를 모두 /dev/null 로 redirection을 건다.( stdio 비활성화)

3) control teminal 를 가지지 않는다.

백그라운드에서 시스템 작업 용도로 쓰임

 

#9 job control : commands

1) jobs => stoped, back-ground process   의 리스트 출력

2) fg %#

  => #에는 jobs 작업번호. (%는 생략 가능)

 => 지정한 프로세스를 fore-ground 한다.

3) bg %#

 =>정지된 백그라운드 프로세스를  back ground  에서 running 상태로 변경

4) command &

 => command를 back-ground에서 running 상태로 실행

 

 

 vi 와 vim , vim hello.c 를 각각 실행 후 ctrl+ z 를 눌러 일시정지시킨다.

그리고 위와 같은 시간이 가는 코드를 작성 후  ctrl+d 로 빠져나오며, bash printdate.sh

타이핑해 쉘스크립을 실행.

 ctrl z 누르면 3번 -  4번이 +에 있다.  fg %2 타이핑시 2번작업이 foreground에 올라온다.

ctrl-z 후 jobs 타이핑 시 2번이 + (가장 최근에 실행된 프로그램)  4번이 - ( 최근 실행 이전에 실행된 프로그램)_

bg %3 하면 background가 되어 러닝 상태로 변경된다. 제어터미널을 잃어버렸기에 프로그램이 무한루프로 출력이 되는데,  kill 명령으로 시그널 보내거나 foreground  불러와서 죽여야한다.

fg %3 ctrl+C  타이핑

 

Session이 종료될 때  session 리더로부터 파생된 child process 들은 SIGHUP 를 받게 된다.(최근에 리눅스는 이를 사용치 않는다)

 

 

해당 내용은  프로그래머스 리눅스 강의 김선영 선생님의 강의를 들으며 기록했습니다.

+ Recent posts