리눅스에서 프로그램을 실행하면 프로그램의 복사본(인스턴스)을 생성하는데
실행 중인 프로그램을 따로 프로세스(process)라고 부른다.
프로세스 리스트(ps), 시스템 사용량 모니터링(top), 프로세스를 멈추기(kill) 등을 할 수 있는 도구를 제공함.
1. 프로세스
- 프로세스: 실행 중인 명령의 복사본(인스턴스), vi를 10번 실행하면 10개의 프로세스가 생성됨
PID(프로세스 ID)로 프로세스들을 구분 가능.
현재 실행 중인 PID들은 중복 불가능.
- runaway process(프로세스가 멈추지 않음 or 계속 새 프로세스를 만듦) 같은 것들이 시스템 성능을 저하시킬 수 있기 때문에 프로세스 관리가 필요함
- 메모리나 CPU 속성을 기준으로 특정 프로세스를 찾아 제거하는 과정이 필요함
- /proc(시스템 리소스 정보가 저장되는 곳)에 저장된 데이터를 가져와서 실행 중인 프로세스의 정보를 표시하게 됨.
- /proc에 숫자로 된 폴더들이 PID번호와 같음
2. 프로세스 출력하기
가장 많이 사용되는 건 ps, 시각적으로 보기 좋은 건 top, 그래픽 기반 도구는 gnome-systemmonitor
1) ps
ps manual page를 참고해보았다
- ps는 active process의 정보를 ps를 실행한 순간 기준으로 보여줌
- 만약 process 정보를 반복해서 업데이트가 필요하면 top을 사용하기
- ps는 옵션을 사용할 수 있는데 UNIX, BSD, GNU에 따라 옵션 선언 방식이 달라짐
- UNIX : 옵션을 모아서 써도 되고 -를 꼭 써야함
- BSD : 옵션을 모아서 써도 되고 -를 꼭 쓰지 않아도 됨
- GNU long : --option 으로 써야함
- 기본적으로 ps는 같은 effective user ID(euid=EUID)를 현재 user로 여기고 같은 terminal에서 실행된 모든 프로세스를 선택한다.
- PID, process와 연관된 terminal(tname=TTY), [DD-]hh:mm:ss 형식의 누적 CPU time(time=TIME), executable name(ucmd=CMD)을 출력함. 결과는 기본적으로 정렬되지 않음.
ps 만 하면 PID, TTY, TIME, CMD 값만 출력됨.
/proc/PID번호 에서 PID에 관한 정보들을 확인할 수 있고
예를 들어 /proc/PID번호/io를 보면 PID에서 io관련해서 사용한 정보를 알 수 있음
$ ps
PID TTY TIME CMD
62583 pts/21 00:00:00 ps
158327 pts/21 00:00:00 bash
$ cat /proc/158327/io
rchar: 12190342
wchar: 3553973
syscr: 18652
syscw: 4821
read_bytes: 1519616
write_bytes: 339968
cancelled_write_bytes: 114688
- ps 명령을 사용하는 예시는 다음과 같다
1) 표준 방식으로 모든 process를 보고 싶으면 :
ps -e
ps -ef
ps -eF
ps -ely
2) BSD 방식 :
ps ax
ps axu
3) process tree를 보고 싶으면 :
ps -ejH
ps axjf
4) thread의 정보를 얻고 싶으면 :
ps -eLf
ps axms
5) 보안 정보를 얻고 싶으면 :
ps -eo euser,ruser,suser,fuser,f,comm,label
ps axZ
ps -eM
6) root(real & effective ID)로 실행되는 모든 프로세스를 user format으로 보고 싶으면 :
ps -U root -u root u
7) 사용자가 정의한 형식대로 프로세스를 보고 싶으면 :
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -Ao pid,tt,user,fname,tmout,f,wchan
8) syslogd의 PID만 보고 싶으면 :
ps -C syslogd -o pid=
9) PID 42의 이름만 보고 싶으면(ubuntu 14.04에서는 SysV option 미지원 에러) :
ps -q 42 -o comm=
- process 선택하는 간단한 옵션
옵션 이름 | 설명 |
-A/-e | 모든 프로세스 선택 |
-a | session leader(getsid(2) 보기)와 terminal과 연관 되지 않은 프로세스를 제외하고 모든 프로세스 선택 |
-d | session leaders를 제외하고 모든 프로세스 선택 |
--deselect/-N |
해당 조건을 만족하는 프로세스를 제외하고 모든 프로세스 선택(선택한 것을 제외) |
T | 이 terminal과 연관된 모든 process를 선택. 다른 옵션없이 t 옵션을 쓰는 것과 같은 동작을 함. |
r | running process들만 제한해서 선택 |
a | BSD 스타일 "only yourself" 제한을 해제 "only yourself" 제한 : 일부 BSD 스타일("-"없는) 옵션이 사용되거나 ps personality 설정이 BSD와 유사할 때 모든 프로세스에 적용됨 다른 말로 이 옵션을 사용하면 ps가 터미널(tty)을 사용해 모든 프로세스를 보여주거나 x 옵션과 함께 사용할 때 모든 프로세스를 보여줌 |
x | BSD 스타일 "must have a tty" 제한을 해제 다른 말로 이 옵션을 사용하면 사용자(ps와 같은 EUID)가 갖고 있는 모든 프로세스를 보여주거나 a 옵션과 함께 사용하면 모든 프로세스를 보여줌 |
- process를 리스트로 선택하기
이 옵션들은 blank로 나누거나 comma(,)로 나누어진 리스트의 형식을 single argument로 받음
ex) ps -p "1 2" 혹은 ps -p 3,4
- process 출력 형식을 사용자가 변경할 수 있음
# u : user기반 형식으로 보여줌
$ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
11+ 23812 0.0 0.0 38652 3660 pts/17 R+ 17:09 0:00 ps u
11+ 28136 0.0 0.0 25828 7284 pts/17 Ss 09:53 0:00 -bash
%CPU, %MEM : 프로세스가 사용하는 CPU, MEMory 사용률
VSZ(virtual set size) : 이미지 프로세스의 크기를 KB단위로 보여줌(프로세스에 할당된 메모리 크기)
RSS(resident set size) : 메모리에서 실행 중인 프로그램의 크기(실제로 사용되는 메모리 크기)
TTY(Teletypewriter) : 일반 CLI console. 컴퓨터에 직접 접속했을 때 연결되는 터미널
pts(Pseudo TTY Slave) : 원격으로 시스템에 접속할 때 연결되는 터미널
STAT : 프로세스 상태
R : running
S : sleep
+ : forground로 실행중
START : 프로세스 실행 시작 시간
TIME : 총 사용 시간(0:00이면 CPU시간을 1초도 사용하지 않음)
- process 정렬이나 표시할 열의 정보를 정할 수 있음.
- 일반적으로 PID 기준으로 정렬됨
# -o : 표시할 열의 정보를 지정
$ ps -eo pid,user,vsz,rss,comm | less
PID USER VSZ RSS COMMAND
6542 11+ 38624 3572 ps
6543 11+ 11136 1020 less
28136 11+ 25828 7284 bash
# --sort= : 해당 기준으로 정렬. 내림차순 정렬은 -를 붙여서 -rss로 하면 됨
$ ps -o pid,user,vsz,rss,comm --sort=rss | less
PID USER VSZ RSS COMMAND
6923 11+ 11136 968 less
6920 11+ 38624 3724 ps
28136 11+ 25828 7284 bash
- 실제로 사용할 때 | less와 함께 사용하면 보기 편함
$ ps ux | less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
11+ 4498 0.0 0.0 38652 3596 pts/17 R+ 17:23 0:00 ps ux
11+ 4499 0.0 0.0 11136 944 pts/17 S+ 17:23 0:00 less
11+ 27987 0.0 0.0 76992 8052 ? Ss 09:53 0:00 /lib/systemd/systemd --user
11+ 27988 0.0 0.0 284040 3112 ? S 09:53 0:00 (sd-pam)
11+ 28109 0.0 0.0 129296 6452 ? S 09:53 0:00 sshd: 11@pts/17
11+ 28136 0.0 0.0 25828 7284 pts/17 Ss 09:53 0:00 -bash
주로 ps aux, ps -ef 를 사용했었는데 다른 옵션들을 사용하면 프로세스를 원하는 대로 볼 수 있구만
man page가 생각보다 길어서 하루에 다 보기 힘들구만ㅠㅠ
다음에 사용할 일이 있으면 STANDARD FORMAT SPECIFIERS 부터 봐야겠다
* /proc : 커널 프로세스를 포함하는 각 실행 중인 프로세스들을 위한 디렉토리를 포함. 디렉토리는 /proc/PID라는 이름을 갖는다. 위키백과 자료
* EUID : 영향을 줄 수 있는 UID, 실제 유저는 user1인데 su user2로 로그인하면 user2의 권한을 행사할 수 있음. 이 때 RUID는 user1, EUID는 user2라고 할 수 있음
* TTY
* session leader : PID와 SID가 같으면 이 프로세스를 session leader라고 함.
'개발 > 리눅스 서버' 카테고리의 다른 글
CVE-2021-3156 sudo 보안 취약점 (0) | 2021.02.26 |
---|---|
gerrit + Apache2 설치 및 설정 (0) | 2020.02.03 |
parse json with default bash only (0) | 2020.01.29 |
linux 명령어 모음집 (0) | 2020.01.22 |
100G 넘는 파일을 어떻게 복사할까? - rsync (0) | 2020.01.21 |
댓글