Skip to content

프로세스 관리

  • 시스템이 구동 될 때, 커널은 /etc 에 위치한 init 이라는 스크립트를 실행함으로써 시스템 서비스들을 차례대로 시작시킨다. 이 서비스들은 데몬 프로그램(background)으로 구현되어 있기 때문에 로그인하지 않은 상태에서도 필요 작업들을 수행한다.

  • 프로그램은 프로그램을 실행시킬 수 있는데, 이를 부모와 자식 프로세스라고 표현한다.

ps

  • 리눅스는 다중 사용자, 사용 작업 시스템이기 때문에 여러 개의 프로세스를 동시에 수행하기 때문에 항상 어떤 프로세스들이 실행되고 있는지 모니터링할 필요가 있다. ps는 이를 위해 현재 시스템에서 실행 중인 프로세스에 관한 정보를 출력하는 명령어이다.
Terminal window
# /proc 디렉터리 이하에 프로세스와 연관된 가상 파일시스템의 내용을 토대로 프로세스 정보를 출력한다.
$ ps --help l
Usage:
ps [options]
Selection by list:
-C <command> command name
-G, --Group <GID> real group id or name
-g, --group <group> session or effective group name
-p, p, --pid <PID> process id
--ppid <PID> parent process id
-q, q, --quick-pid <PID>
process id (quick mode)
-s, --sid <session> session id
-t, t, --tty <tty> terminal
-u, U, --user <UID> effective user id or name
-U, --User <UID> real user id or name
The selection options take as their argument either:
a comma-separated list e.g. '-u root,nobody' or
a blank-separated list e.g. '-p 123 4567'

부모 프로세스와 자식 프로세스의 관계를 보려면 ps -ef, 프로세스 상태를 보는 용도로는 ps aux를 주로 사용한다.

pstree

  • 프로세스를 트리 형태로 출력한다.
Terminal window
$ pstree [옵션]
systemd─┬─ModemManager───2*[{ModemManager}]
├─acpid
├─2*[agetty]
├─amazon-ssm-agen─┬─ssm-agent-worke───8*[{ssm-agent-worke}]
└─8*[{amazon-ssm-agen}]
...
Display a tree of processes.
-a, --arguments show command line arguments
-A, --ascii use ASCII line drawing characters
-c, --compact-not don't compact identical subtrees
-C, --color=TYPE color process by attribute

pgrep

  • 지정한 패턴과 일치하는 프로세스의 정보를 출력한다.

  • 파일 패턴 검색 명령어인 grep 명령어의 프로세스 버전이라고 보면된다.

Terminal window
$ pgrep --help
Usage:
pgrep [options] <pattern>
Options:
-d, --delimiter <string> specify output delimiter
-l, --list-name list PID and process name
-a, --list-full list PID and full command line
-v, --inverse negates the matching
-w, --lightweight list all TID
-c, --count count of matching processes
-f, --full use full process name to match

프로세스 전환 (foreground / background)

  • foreground: 보통 터미널에서 명령어를 입력하면 그 명령이 끝날때 까지 다른 명령어를 입력할 수가 없다. 이렇게 대화식으로 하나씩 주고 받게 되는데 이를 foreground라고 생각하면 된다.

  • background: 반면 background는 명령어를 입력하면 다른 명령어도 실행이 가능하다. background라는 의미에서 유추할 수 있듯이 뒤에서 실행된다고 생각하면 된다. 물론 터미널이 닫히거나 로그아웃 될경우 종료 된다.

jobs

  • jobs 명령어는 현재 돌아가고 있는 background 프로세스 리스트를 모두 출력해준다.

  • background 프로세스는 스택처럼 쌓이는데, +는 스택의 가장 위에 있다는 뜻이고 -는 바로 그다음 밑에 있다는 뜻이다.

background processing (&)

  • 명령어들을 background에서 처리하면 foreground에서는 다른 작업을 할 수 있으며 동시에 여러 작업을 수행할 수 있다.

  • 명령어의 맨 끝에 & 를 붙여 사용하면 background로 명령어가 실행된다.

foreground -> background (bg)

  • foreground에서 실행중인 명령에서 Ctrl + z 를 누른후 (일시정지) bg [job번호] 명령을 치면, background로 전환된다.

background -> foreground (fg)

  • fg는 background에서 foreground로 전환하는 명령어이다. job 번호를 생략하면 스택 제일 위에 있는 것이 foreground로 들어온다.

  • background로 실행시킨 프로세스를 일시중지 시키려면 fg로 가져와서 Ctrl + z 해주면 된다.

Terminal window
# background에 멈춰있던 잡을 foreground로 보내 셸 프롬프트상에서 다시 실행하는 명령어
$ fg [job 번호]

프로세스 우선순위

  • 스케줄링시 반영되는 우선순위를 관리할 수 있다.

nice

  • 프로세스의 우선순위를 의미하는 nice 값을 설정한다.

  • nice 명령어의 우선순의 숫자 조절 연산은, 대시(-) 하나는 증가, 두개(--)는 감소이다.

[우선순위 NI 값 범위]

  • 사용자가 지정할 수 있는 우선순위 값은 -20부터 19까지인데 값이 낮아야 우선순위가 높으므로, 가장 높은 우선순위는 -20이 되게 된다.
    • 가장 높은 우선순위 NI 값 : -20
    • 가장 낮은 우선순위 NI 값 : 19
    • 기본적으로 주어지는 디폴트 값: 0
Terminal window
# 기존 우선순위 값에 NI만큼 더한 우선순위로 [프로세스명]을 실행시킨다.
$ nice -n [NI값] [프로세스명]
# -n 옵션 없이 사용할 경우 NI값은 디폴트로 10을 갖는다. 즉 10을 더해 우선순위를 낮춰서 실행시키는 것
$ nice [프로세스명]
# nice -n N 한 것과 동일. NI값만큼 증가
$ nice -[NI값] 프로세스명
# NI값만큼 감소
$ nice --[NI값] 프로세스명

renice

  • 현재 실행중인 프로세스의 nice값을 변경한다.

  • nice는 프로세스명으로 우선순위를 조정하고, 명령을 실행하면 새로운 프로세스가 발생하지만, renice는 PID로 우선순위를 조정하고 기존의 프로세스 우선순위 값을 추가없이 바로 수정한다.

Terminal window
$ renice [옵션] [변경할 NI값] [PID]
$ renice --help
Usage:
renice [-n] <priority> [-p|--pid] <pid>...
renice [-n] <priority> -g|--pgrp <pgid>...
renice [-n] <priority> -u|--user <user>...
Alter the priority of running processes.
Options:
-n, --priority <num> specify the nice value
-p, --pid interpret arguments as process ID (default)
-g, --pgrp interpret arguments as process group ID
-u, --user interpret arguments as username or user ID
-h, --help display this help
-V, --version display version

nohup

  • 일반적으로 시스템에서 로그아웃하면 로그아웃한 세션과 연관된 모든 프로세스에게 HUP 시그널(1)을 보내서 관련된 모든 프로세스가 자동으로 종료되지만, nohup을 사용하면 해당 시그널을 가로채 무시하기 때문에 로그아웃하더라도 프로세스를 계속 실행되게 된다.
  • 즉, 사용자가 로그아웃해도 실행중인 프로세스를 백그라운드로 유지시켜주는 명령어이다.
Terminal window
$ nohup command