IT Technology/Linux

리눅스 프로세스 명령어 관련 정리(ps, top, kill, etc..)

by빵수 2024. 1. 4. 08:42
728x90
반응형

리눅스 프로세스 명령어 관련에 대해서 알아보자.

 

 

 

리눅스 프로세스 동작 원리

 

시스템이 구동될 때, 커널은 /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]

 

 

 

 

 

 

 

 

출처 : https://inpa.tistory.com/entry/LINUX-%F0%9F%93%9A-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC-%EB%AA%85%EB%A0%B9%EC%96%B4-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC-Foreground-Background

 

참고 : https://blog.naver.com/tmk0429/222318530824

반응형