리눅스 프로세스 명령어 관련에 대해서 알아보자.
리눅스 프로세스 동작 원리
시스템이 구동될 때, 커널은 /etc 에 위치한 init 이라는 스크립트를 실행함으로써 시스템 서비스들을 차례대로 시작시킨다.
이 서비스들은 데몬 프로그램(백그라운드)으로 구현되어 있기 때문에 로그인하지 않은 상태에서도 필요 작업들을 수행한다.
- 프로그램은 프로그램을 실행시킬 수 있는데, 이를 부모와 자식 프로세스라고 표현한다.
- 커널은 이러한 프로세스들을 구조화시킨 형태로 유지하기 위해서 PID 라는 프로세스 ID 정보를 가지고 있다.
- 예를 들어, 위에서 말한 init은 항상 1번 PID를 할당받는다.
리눅스 프로세스 명령어
프로세스 출력 (ps)
- 리눅스는 다중 사용자, 사용 작업 시스템이기 때문에 여러 개의 프로세스를 동시에 수행하기 때문에 항상 어떤 프로세스들이 실행되고 있는지 모니터링할 필요가 있다.
- 따라서 현재 시스템에서 실행 중인 프로세스에 관한 정보를 출력하여 사용자에게 정보를 제공하는 명령어가 필요한데 이때 사용하는 명령어가 ps이다.
- 윈도우에서 특정 프로세스가 실행 중인지 확인하거나 강제 종료하기 위해 작업 관리자를 사용하듯이, 리눅스에서는 ps 명령어가 자주 사용된다.
- 특히 GUI를 사용하지 않는 서버 환경에서는 대부분의 프로세스들이 백그라운드에서 동작하기 때문에 특정 프로세스가 동작 중인지 확인하기 위해서 많이 쓰인다.
$ ps [옵션]
# /proc 디렉터리 이하에 프로세스와 연관된 가상 파일시스템의 내용을 토대로 프로세스 정보를 출력.
[기본 프로세스 출력 옵션]
a : 터미널과 연관된 프로세스만 출력
x : 터미널과 연관되지 않는 프로세스만 출력
-A : 모든 프로세스 출력 (-e와 동일)
-e : 모든 프로세스 출력
-a : 세션 리더와 터미널과 연관되지 않은 프로세스를 제외하고 모든 프로세스를 출력
[지정한 프로세스 출력]
p : 지정한 PID 목록의 정보만 출력
-C : 지정한 프로세스의 실행 파일 이름의 정보만 출력
-u : 특정 사용자의 프로세스 정보를 출력
[프로세스 표시 형식]
u : 프로세스의 소유자 정보를 함께 출력
l : BSD 형식의 긴 형식으로 출력
e : 프로세스 정보와 함께 프로세스의 환경변수 정보도 출력
-l : 긴 포맷으로 출력
-o : 사용자 정의 형식 지정 가능
[프로세스 장식]
f : 프로세스 계층을 텍스트 형식의 트리구조를 보여줌.
-f : 전체 포맷으로 출력
옵션 | 의미 |
a | 터미널과 연관된 프로세스 출력 보통 x 옵션과 연계하여 모든 프로세스를 출력할때 사용 |
e | 프로세스에 관련된 환경 변수 정보 출력 |
f | 프로세스간 상속관계를 트리형식으로 출력 |
l | 프로세스의 정보를 길게 보여줌 |
u | 프로세스의 소유자를 기준으로 출력 |
x | 터미널에 종속되지 않는 프로세스 출력 |
p | 지정한 프로세스 출력 |
-a | 세션리더를 제외하고 터미널에 종속되지 않은 모든 프로세스 출력 |
-A | 모든 프로세스 출력 |
-C [process] | 뒤에 입력된 프로세스만 출력 |
-e | 모든 프로세스 출력 |
-f | 유닉스 스타일로 출력해줌 |
-o [value] | 출력 포맷을 지정함, 값에는 pid, tty, time 등을 지정한다. |
ps 프로세스 도표 항목
프로세스 항목 | 의미 |
F | 프로세스 플래그 |
S | 프로세스 상태코드 |
UID | 프로세스 소유자이름 |
PID | 프로세스 고유식별자 |
PPID | 부모프로세스의 PID |
C | 프로세서 사용률 %로 표기 |
PRI | 프로세스의 우선순위. 높은값이 낮은 우선순위 |
NI | nice 값이며 19에서 -20값 |
SZ | 프로세스 이미지가 차지하는 물리적 페이지 크기 |
WCHAN | 대기중일때 커널 함수의 이름 |
STIME | 프로세스가 시작한 시간 |
TTY | 터미널의 종류 |
TIME | 총 CPU 사용시간 |
CMD | 프로세스의 실행 시 명령줄 |
[자주 쓰는 명령어 모음]
$ ps -p 1(프로세스 번호가 1인 프로세스 출력)
$ ps -u apache(계정이 apache인 프로세스들을 )
$ ps -fp [PID] # PID를 키워드로 프로세스 정보를 확인
$ ps -u root # 특정 사용자가 돌리는 프로세스의 정보를 알고 싶을 때
$ ps -p 1222 -o comm= # PID가 1222인 프로세스의 이름을 출력
$ ps -C httpd -o pid= # 이름이 httpd인 프로세스들의 pid를 출력
프로세스를 트리 형태로 출력 (pstree)
$ pstree [옵션]
옵션 | 의미 |
-a | 프로세스 명령줄 인자 출력 |
-h | 현재 프로세스와 부모 프로세스를 강조 표시 |
-n | 프로세스 이름 대신에 PID순으로 정렬 |
-p | PID와 함께 출력 |
-s | 특정 프로세스의 부모 프로세스를 출력 |
실시간 프로세스 출력 (top)
옵션 | 의미 |
-n | 지정한 숫자만큼 화면 출력을 갱신한후 명 |
-u | 지정한 사용자의 프로세스를 모니터링 |
-b | 출력결과를 파일이나 다른 프로그램으로 전달 |
-d | 화면갱신주기를 초 단위로 설정 |
-p | 지정한 PID 프로세스를 모니터링 |
[시스템 요약 부분 항목]
- 첫째줄 -현재시간, 서버가동 후 유지시간, 현재 접속 사용자, 최근 1, 5, 15분 동안 시스템 부하
- 둘째 줄 - 프로세스의 상태(총 프로세스, 실행 중, sleep, stop, 좀비프로세스)
- 셋째 줄 - cpu 상태
- 넷째 줄 - MEM 상태
- 다섯째 줄 - swap메모리 상태
[프로세스 cpu 사용 순서 부분 항목]
- PR - 우선순위
- NI - Nice value(-20~19 사이의 숫자이며 값이 작을수록 우선순위가 높음)
- VIRT - 작업에 사용된 가상 메모리 총사용량
- RES - 프로세스가 사용하는 실제 메모리양
- SHR - 프로세스가 사용하는 공유 메모리양
- S - 현재 프로세스의 상태를 나타냄
- TIME+ - 프로세스가 시작하여 사용한 CPU시간
$ ps 명령어는 명령어가 실행된 순간의 프로세스 상태들에 대해서 정적인 정보만을 제공하며,
$ top 은 시스템 활동을 실시간으로 확인할 수 있다.
top 프로그램은 활동 순으로 나열된 프로세스들을 지속적으로 갱신하면서 보여준다.
위쪽은 시스템에 대한 전반적인 요약을 보여주며,
아래에 테이블로써 CPU를 사용하는 순으로 프로세스들을 정렬해서 보여준다.
[top을 통해 모니터링 중인 상태에서 h를 누르면 다양한 추가적인 기능들에 대한 도움말을 볼 수 있다.]
[top 역시 하나의 프로세스가 되기 때문에 top의 결과에서 top 프로세스도 같이 등장하며, 시스템 리소스를 굉장히 적게 사용하기 때문에 시스템 부하를 적게 일으키는 좋은 프로그램이다.]
최근에는 htop이라는 조금 더 사용자에게 친화적인 도구를 사용하기도 한다.
프로세스 제어
시그널-프로세스 종료(kill)
- 시그널은 프로세스 사이의 통신 수단인데 어떤 프로세스에 메시지를 보내 프로세스를 제어한다.
- 명령어를 실행함으로써 프로세스가 시작되고 그 프로세를 제어하기 위하여 사전에 정의된 시그널이 존재한다.
번호 1 - SIGHUP : 터미널에서 접속이 끊겼을 때 보내지는 시그널, 변화된 내용을 적용하기 위해 재시작할 때 사용된다.
번호 2 - SIGINT : 인터럽트 시그널로 실행을 중지시킴, Ctrl + c 입력 시 보내지는 시그널
번호 3 - SIGQUIT : 실행 중지 시그널로서 Ctrl + \ 입력시 보내지는 시그널
번호 9 - SIGKILL : 프로세스를 강제로 종료시키는 시그널
번호 15 - SIGTERM : kill의 기본 시그널로 정상 종료 시키는 시그널
번호 18 - SIGCONT : 시그널에 의해 정지된 프로세스를 다시 실행시키는 시그널
번호 19 - SIGSTOP : 정지 시그널
번호 20 - SIGTSTP : 일시정지 시키는 시그널로서 Ctrl + z 입력 시 보내지는 시그널
- 위의 경우처럼 몇 가지 시그널이 존재하는데 불필요한 프로세스, 잘못 실행된 프로세스를 죽이는 데 사용할 것은 KILL이 있다.
- kill 명령어는 프로세스를 강제로 종료시킨다.
- 좀비 프로세스나, 응답 없음, 비정상적으로 동작하는 프로세스들의 실행을 끝내게 해 준다.
- 프로세스를 포어그라운드로 가져와서 ctrl + C 할 수도 있지만, PID를 확인하여 kill로 바로 종료시킬 수도 있다.
$ kill [options] [pid]
$ kill -9 PID # PID를 시그널 번호 9(KILL) 전송해서 죽임
$ kill -TERM -1 # 자신이 실행한 모든 프로세스를 종료
옵션 의미
-signal, -s signal : 지정한 시그널을 보냄
-l : 사용 가능한 시그널의 목록을 출력
프로세스 여러 개 종료 (killall)
- 지정한 이름에 부합하는 모든 프로세스에게 시그널을 보낸다.
- 시그널을 지정하지 않으면 SIGTERM(15) 전송한다.
- 지정한 프로세스 이름에 매칭되는 프로세스가 모두 종료되므로 여러 프로세스를 띄우고 있는 데몬을 종료할 때 유용하다.
$ killall [option] [signal] 프로세스
백그라운드 프로세스 출력 (jobs)
- jobs 명령어는 현재 돌아가고 있는 백그라운드 프로세스 리스트를 모두 출력해 준다.
- 백그라운드 프로세스는 스택처럼 쌓이는데,
- +는 스택의 가장 위에 있다는 뜻이고
- -는 바로 그다음 밑에 있다는 뜻이다.
$ jobs [options] [job name or number]
'IT Technology > Linux' 카테고리의 다른 글
Linux RPM Packages 설치 방법 (0) | 2024.01.24 |
---|---|
Red Hat Linux License 등록 안될 때 조치 방법 (0) | 2024.01.08 |
리눅스 디스크 추가 인식 명령어 (0) | 2023.12.20 |
Linux Repository config (0) | 2023.11.27 |
LVM 디스크 증설 시 resize2fs 에러 (0) | 2023.10.13 |