전공과목 정리/리눅스시스템 + 시스템프로그래밍

[리눅스시스템🐧] 6장 프로세스

최연재 2024. 1. 3. 02:45

교재 : 리눅스 시스템 원리와 실제 (창병모, 생능출판)

 

6.1 프로세스

1) 프로세스 (process)

- 실행 중인 프로그램

- 프로세스 번호 : 각 프로세스는 유일한 프로세스 번호 PID를 갖는다. 

- 부모 프로세스 : 각 프로세스는 부모 프로세스에 의해 생성된다.

- 프로세스의 종류

  • 시스템 프로세스
  • 시스템 운영에 필요한 기능을 수행하는 프로세스
  • 어떤 서비스를 위해 부팅 시 생성되는 데몬 프로세스
  • 사용자 프로세스
  • 사용자의 명령 혹은 프로그램을 실행시키기 위해 생성된 프로세스

2) 프로세스 상태 보기 : ps (process status)

$ ps [-옵션]

: 현재 시스템 내에 존재하는 프로세스들의 실행 상태를 요약해서 출력함.

- ps 출력 정보

  • UID : 프로세스를 실행시킨 사용자 ID
  • PID : 프로세스 번호
  • PPID : 부모 프로세스 번호
  • C : 프로세스 우선순위
  • STIME : 프로세스의 시작 시간
  • TTY : 명령어가 시작된 터미널
  • TIME : 프로세스에 사용된 CPU 시간
  • CMD : 실행되고 있는 명령어(프로그램) 이름

 

3) 특정 프로세스 리스트 : pgrep

- 사용법 : 패턴에 해당되는 프로세스들만을 리스트한다.

$ pgrep [옵션] [패턴]
  • -l : PID와 함께 프로세스의 이름을 출력한다.
  • -f : 명령어의 경로도 출력한다.
  • -n : 패턴과 일치하는 프로세스들 중에서 가장 최근 프로세스만을 출력한다.
  • -x : 패턴과 정확하게 일치되는 프로세스만 출력한다.
  • -a : 전체 명령어 줄과 PID를 출력한다.

cf) 특정 프로세스만 리스트

$ ps -ef | grep -w sshd

 : sshd 단어가 포함된 줄만 리스트

 

6.2 작업 제어

1) 쉘과 프로세스

 

2) 후면 처리

$ 명령어 &

 

3) 쉘 재우기 

$ sleep 초

: 명시된 시간만큼 프로세스 실행을 중지시킨다.

 

4) 강제 종료 : ctrl C

 

5) 실행 중지 : ctrl D

 

6) 후면 작업의 전면 전환 : fg (foreground)

$ fg

: 정지된 작업을 다시 전면에서 실행시킨다.

$ fg %작업번호

: 작업번호에 해당하는후면 작업을 전면 작업으로 전환한다.

 

7) 전면 작업의 후면 전환 : bg (background)

$ bg %작업번호

: 작업번호에 해당하는 중지된 작업을 후면작업으로 전환하여 실행한다.

- 사용법 : ctrl Z로 전면 실행 중인 작업을 중지시키고 bg 명령어를 사용하여 후면 작업으로 전환

 

8) 후면 작업의 입출력 제어

- 후면 작업의 출력 : 출력 재지정 이용

- 후면 작업의 입력 : 입력 재지정 이용 

 

6.3 프로세스 제어

1) 프로세스 끝내기 : kill

$ kill 프로세스번호
$ kill %작업번호

: 프로세스 번호(혹은 작업 번호)에 해당하는 프로세스를 강제 종료시킨다.

 

* exit 명령어 : exit [종료코드]

 

2) 프로세스 기다리기 :  wait

$ wait [프로세스번호]

: 프로세스 번호로 지정한 자식 프로세스가 종료될 때까지 기다린다. 지정하지 않으면 모든 자식 프로세스가 끝나길 기다린다.

 

3) 프로세스 우선순위

- 실행 우선순위 : nice 값

  • 19(가장 낮음) ~ -20(제일 높음)
  • 보통 기본 우선순위 0으로 명령어 실행

- nice 명령어 : 주어진 명령을 조정된 우선순위로 실행한다.

$ nice [-n 조정수치] 명령어 [인수들]

- 현재 우선순위 출력

$ nice

 

- 프로세스 우선순위 조정  :  이미 수행 중인 프로세스의 우선순위를 명시된 우선순위로 변경한다.

$ renice [-n] 우선순위 [-gpu] PID
  • -g : 해당 그룹명 소유로 된 프로세스
  • -p :해당 프로세스의 PID
  • -u : 지정한 사용자명의 소유로 된 프로세스 

 

6.4 프로세스의 사용자 ID

1) 프로세스의 사용자 ID

- 프로세스는 사용자 ID와 그룹 ID를 갖는다.

  • 그 프로세스를 실행시킨 사용자의 ID와 사용자의그룹 ID
  • 프로세스가 수행할 수 있는 연산을 결정하는 데 사용된다.

- id 명령어 : 사용자의 실제 ID, 유효 사용자 ID, 그룹 ID 등을 보여준다.

$ id [사용자명]

 

- 프로세스의 실제 사용자 ID (real user ID)

  • 그 프로세스를 실행시킨 사용자 ID

- 프로세스의 유효 사용자 ID (effective user ID)

  • 현재 유효한 사용자 ID
  • 보통 유효 사용자 ID == 실제 사용자 ID
  • 새로 파일을 만들 때나 파일의 접근권한을 검사할 때 주로 사용됨.
  • 특별한 실행 파일을 실행할 때 유효 사용자 ID는 달라진다.

2) set-user-id 실행파일

- set-user-id(set user ID upon execution) 실행 권한

  • set-user-id가 설정된 실행파일을 실행하면 이 프로세스의 유효 사용자 ID는 그 실행파일의 소유자로 바뀜.
  • 이 프로세스는 실행되는 동안 그 파일의 소유자 권한을 갖게 됨.

- 실행 권한 설정 예시

$ chmod 4755 파일
$ chmod u+s 파일

- set-user-id 실행파일을 실행하는 과정

  1. /bin/passwd 파일은 set-user-id 실행권한이 설정된 실행 파일이며 소유자는 root
  2. 일반 사용자가 이 파일을 실행하면 이 프로세스의 유효 사용자 ID는 root가 된다.
  3. 유효 사용자 ID가  root이므로 root만 수정할 수 있는 암호 파일 (/etc/shadow 파일을 접근하여 수정)

 

3) set-group-id 실행파일

- set-group-id(setgroup ID upon execution) 실행 권한

: 실행되는 동안에 그 파일 소유자의 그룹이 프로세스의 유효 그룹 ID가 된다.

- 실행권환 설정 예시

  • set-group-id 실행권한은 8진수 모드로 2000 으로 표현된다.
$ chmod 2755 파일
$ chmod g+s 파일

 

6.5 시그널과 프로세스

1) 시그널

- 시그널 : 예기치 않은 사건이 발생할 때 이를 알리는 소프트웨어 인터럽트

- 시그널을 이용하여 프로세스를 제어한다.

- 시그널 리스트

$ kill -l

- 주요 시그널

시그널 이름 의미 기본 처리
SIGABRT abort()에서 발생되는 종료 시그널 종료(코어 덤프)
SIGALRM 자명종 시계 alarm()이 울릴 때 발생하는 알람 시그널 종료
SIGCHLD 프로세스의 종료 또는 정지를 부모에게 알리는 시그널 무시
SIGCONT 정지된 프로세스를 계속시키는 시그널 무시
SIGFPE 0으로 나누기와 같은 심각한 산술 오류 종료(코어 덤프)
SIGHUP 연결 끊김 종료
SIGILL 잘못된 하드웨어 명령어 수행 종료(코어 덤프)
SIGIO 비동기화 I/O 이벤트 알림 종료
SIGINT 터미널에서 ctrl c할 때 발생하는 인터럽트 시그널 종료
SIGKILL 잡을 수 없는 프로세스를 종료시키는 식널 종료
SIGPIPE 파이프에 쓰려는데 리더가 없을 때 종료
SIGPIPE 끊어진 파이프 종료
SIGPWR 전원고장 종료
SIGSEGV 유효하지 않은 메모리 참조 종료(코어 덤프)
SIGSTOP 프로세스 정지 시그널 정지
SIGSTP 터미널에서 ctrl z할 때 발생하는 정지 시그널 정지
SIGSYS 유효하지 않은 시스템 호출 종료(코어 덤프)
SIGTERM 잡을 수 있는 프로세스 종료 시그널  종료
SIGTTIN 후면 프로세스가 제어 터미널을 읽기 정지
SIGTTOU 후면 프로세스가 제어 터미널에 쓰기 정지
SIGUSR1 사용자 정의 시그널 종료
SIGUSR2 사용자 정의 시그널 종료

 

2) 시그널 보내기 : kill 명령어

- kill 명령어 

: 한 프로세스가 다른 프로세스를 제어하기 위해 특정 프로세스에 임의의 시그널을 강제적으로 보낸다.

- 사용법

$ kill [-시그널] 프로세스번호
$ kill [-시그널] %작업번호
  • 프로세스 번호(혹은 작업번호)로 지정된 프로세스에 원하는 시그널을 보낸다.
  • 시그널을 명시하지 않으면 SIGTERM 시그널을 보내 해당 프로세스를 강제 종료

- (예시) 종료 시그널 보내기

$ kill -9 프로세스번호
$ kill -KILL %작업번호