-
맥 터미널 명령어 입문5: 프로세스 확인, 종료개발입문/개발환경 세팅 2016. 12. 22. 00:36
안녕하세요 :)
컴퓨터가 먹통일 때 작업관리자에서 실행중인 응용프로그램을 확인하고 응용프로그램이 응답없음 상태인 대상을 콕 집어서 강제종료 한 적 있으시죠? 폰에서도 앱끼리 충돌이 나서 반응이 없을 때, 홈버튼을 통해 강제로 실행중인 애플리케이션을 날려본 적 있으시죠? 응답없음 상태는 과부하를 주는 작업을 요청했거나, 프로세스 간 충돌을 일으켰을 때 가끔 확인할 수 있습니다.
이번 포스트에서는 맥 터미널, 유닉스 UNIX 환경에서 에서 프로세스를 확인 및 종료하는 방법을 살펴보겠습니다.
역시나 저의 공부이므로 운영체제 기본부터 차근히 정리해보겠습니다. :3
| 커널과 프로세스 이론
운영체제의 핵심인 커널(Kernel) 이
컴퓨터 리소스 (CPU, Memory, Devices etc.)를 이용하여
프로그램 (Applications)를 실행합니다.
- 프로그램: 실행가능한 소스코드 모음
- 프로세스: 컴퓨터가 리소스를 통해 실행하고 있는 작업 단위
프로그램은 실행할 수 있는 파일(소스코드 모음)을 말하며 일단 실행되면 (메모리에 올라와 CPU를 할당받고 실행되고 있는 상태이면) 프로세스라고 부릅니다. 커널은 동시에 여러 프로세스에게 자원을 할당합니다. 리소스 관리(할당 및 할당해제, 스케쥴링 등) 효율적으로 하면서 사용자가 느끼기에 마치 커널이 여러 프로세스를 동시에 실행시키고 있는 것처럼 느끼도록 합니다.
운영체제 실행 레이어
OS의 프로세스 관리
▶︎ 프로세스에 대해 더 잘 알고 싶다면-
운영체제 프로세스 정리 | http://bowbowbow.tistory.com/16
이제 본론으로 들어가 터미널을 통해 운영체제가 실행시키고 있는 프로세스를 알아봅니다.
이 글은 입문자 용이며 자세한 옵션은 아래 매뉴얼을 참고해주시기 바랍니다. 옵션, ps 명령어 결과 컬럼명 상세는 다음 링크에서 확인해주시기 바랍니다.
▶︎ 공식 매뉴얼 (영문): http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html
▶︎ 한글요약: http://lily.mmu.ac.kr/lecture/08sm/Fedora2/7jang/4.htm
| PS (Process Status) 개요
ps 명령어를 입력한 순간의 정보를 보여줍니다. 현재의 셸 (껍데기, 명령 프롬프트 터미널)에 의해서 수행된 프로세서들을 조회할 수 있습니다.
1. ps 실행
터미널을 실행시키고 ps 명령어를 입력하면, 터미널의 프로세스인 셸 프로세스 (Shell Process)가 실행됩니다.
아직 이 터미널 또는 셸 프로세스에서 아무 프로그램도 실행하지 않았기 때문에 결과는 한 줄 셸 프로세스 자기자신인 -bash 만 출력됩니다.
$ ps
PID TTY TIME CMD
636 ttys000 0:00.01 -bash
2. ps 리스팅 옵션 사용
터미널을 새 탭에서 또는 새 창에서 열고 다시 ps 명령어를 실행시켜봅니다. 이번에는 옵션을 추가합니다.
-f (Full Listing, 정규화된 포맷)
프로세스의 정보에 대해 상세하게 출력합니다.
-l (Long Listing, 자세한 리스팅)
프로세스의 기본 정보 및 프로세스가 사용하고 있는 OS 자원(CPU, Memory) 활용 규모, OS의 리소스 활성화 상태 등을 출력합니다.
-o (Optional Listing, 컬럼값 선택)
프로세스의 상태값 중 출력을 원하는 컬럼값을 지정하여 요청, 출력합니다.
$ ps -f
UID PID PPID C STIME TTY TIME CMD
501 636 635 0 1:36PM ttys000 0:00.01 -bash
501 652 651 0 1:39PM ttys001 0:00.01 -bash
$ps -l
UID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD
501 636 635 4006 0 31 0 2463084 1480 - S 0 ttys000 0:00.03 -bash
501 652 651 4006 0 31 0 2463084 1556 - S 0 ttys001 0:00.03 -bash
$ps -o pid,ppid,time
PID PPID TIME
6624 6623 0:00.07
칼럼 중 꼭 필요한 정보는 아래와 같이 3개-
- UID: User ID, 터미널이 동일한 UID 501, 일반적으로 컴퓨터의 최초 사용자를 가리키는 UID 501을 출력합니다. (다를 수 있습니다.)
- PID: Proces ID, 동일한 프로그램이지만 다른 PID (Process ID) 를 부여받았습니다.
- PPID: Parent Process Id, 이 프로세스를 실행시킨 부모 프로세스의 PID 를 출력합니다.
그 외 기타 명령어는 다음과 같습니다.
- TTY: The Controlling Terminal For the Process, 터미널 번호를 출력합니다.
- Time: 시작 시간
- CPU: 해당 프로세스가 사용한 CPU 시간의 양
- CMD: 실행중인 명령 커맨드
▶︎ 기타 컬럼명 확인: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html3. 셸 실행 프로세스 확인
셸 shell 에서 AnyDo라는 프로그램을 실행시키고 다른 셸에서 이것을 확인해봅니다. ps 명령어를 사용해서 확인해보면, ./AnyDo 프로세스를 확인할 수 있습니다. 자세히 살펴보면 AnyDo 프로세스의 PPID (Parent Process ID) 는 636으로 이 프로그램을 실행시킨 곳: 터미널 (셸 프로세스) 을 가리킵니다.
$ ps -f
UID PID PPID C STIME TTY TIME CMD
501 636 635 0 1:36PM ttys000 0:00.03 -bash
501 696 636 0 1:44PM ttys000 0:02.33 ./AnyDo
501 652 651 0 1:39PM ttys001 0:00.02 -bash
보통의 경우 사용자는 터미널에서 한번에 하나의 프로세스만 실행할 수 있습니다. 그리고 예시로 실행시킨 사용자 프로그램 AnyDo는 여느 프로세스와 같이 포어그라운드 작업(Foreground Task) 이기 때문에 그 프로세스를 종료할 때까지 터미널은 입력 불가능한 상태입니다. 포어그라운드 프로세스를 실행시킨 후, 프로세스 실행/종료와 상관 없이 터미널을 사용하고자 한다면 실행시킬 때 옵션으로 & 을 추가하면 됩니다. & 를 추가하면 터미널이 Cmd + Z 를 누르고 포어그라운드 작업 프로세스를 빠져나와도 프로세스는 종료되지 않습니다.
▶︎ 포어그라운드, 백그라운드 프로세스 설명: http://andrew0409.tistory.com/30
| 모든/특정 유저의 프로세스 확인
ps 는 기본적으로 현재 셸 프로세스의 정보를 출력합니다.
셸 프로세스 외 다른 프로세스를 출력하고 싶을 때에는 -e, aux, -u 등 다양한 옵션을 사용할 수 있습니다.
1. 모든 프로세스 출력
셸 프로세스 외 모든 프로세스를 출력하고 싶을 때에는 -e 옵션 또는 aux 을 사용해야 합니다. 리스팅 수가 너무 많을 수 있으니 | less 명령을 포함시켜 주세요.
$ ps -ef | less
$ ps aux | less
ps 명령어를 작성하는 형식은 3가지가 있습니다.
- 유닉스 옵션:- e, -a, -u
-알파벳의 유닉스 형식입니다. man ps 로 ps 명령어의 내장 매뉴얼을 검색하면 확인할 수 있습니다.
- BSD 옵션: a, u, x
a : 터미널에서 실행한 프로세스의 정보 출력
u : 프로세스 소유자 이름, CPU, 메모리 사용량 등 상세정보 추력
x : 시스템에서 실행중인 모든 프로세스의 정보 출력
2. 특정 유저의 프로세스 출력
특정 사용자의 리스팅 결과를 필터링 해서 보고싶은 경우는 -u (User) 옵션을 사용합니다. (내용이 너무 많은 것을 감안해서 | less 명령어를 추가하였습니다.)
$ ps -u <유저명> | less
UID PID TTY TIME CMD
501 1178 ?? 0:23.09 /Applications/Microsoft Excel.app/Contents/MacOS/Microsoft Excel -psn_0_491640
501 1182 ?? 0:00.92 /Applications/TextEdit.app/Contents/MacOS/TextEdit -psn_0_499834
(...)
$ ps -u root | less
UID PID TTY TIME CMD
0 77 ?? 5:38.76 /Library/Application Support/Symantec/Daemon/SymDaemon.bundle/Contents/MacOS/SymDaemon
0 588 ?? 0:00.03 /System/Library/CoreServices/SubmitDiagInfo server-init
(...)
| 특정 프로세스 확인
1. 프로세스 식별자를 통해 필터링 조회이미 프로세스 식별자를 완벽하게 안다는 전제 하에 사용하는 명령어입니다.
사실 프로세스 ID 든, 프로세스명이든 정확하게 알기는 쉽지 않습니다. 그 때 아래와 같인 -p (Process) 옵션을 사용하게 됩니다.
- -p: 프로세스 ID 로 리스팅 결과를 필터링 조회
- -C: 프로세스 명으로 리스팅 결과를 필터링 조회 (프로세스명 완전 일치 필요)
(-C 옵션은 완전 일치 검색이기 때문에 효용성이 다소 떨어집니다. 이에 | grep 을 활용합니다.)
$ ps -p 1178
PID TTY TIME CMD
501 1178 ?? 0:32.89 /Applications/Microsoft Excel.app/Contents/MacOS/Microsoft Excel -psn_0_491640
2. 기타 명령어 응용
- | less
- | grep <프로세스명> 부분검색을 위해서는 파이프로 | grep 명령을 사용합니다.
- | head -5 / tail -5 : 상위/하위(최근) 5개의 프로세스만 조회합니다.$ ps -ef -u <유저명> | less
$ps -ef -u <유저명> | grep Microsoft
501 277 ?? 0:00.00 /Applications/Microsoft Word.app/Contents/MacOS/Microsoft Word -psn_0_73746
501 278 ?? 0:00.00 /Applications/Microsoft PowerPoint.app/Contents/MacOS/Microsoft PowerPoint -psn_0_77843
501 394 ?? 0:01.65 /Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/Microsoft AU Daemon.app/Contents/MacOS/Microsoft AU Daemon -psn_0_167977
501 1178 ?? 0:23.40 /Applications/Microsoft Excel.app/Contents/MacOS/Microsoft Excel -psn_0_491640
501 1343 ttys000 0:00.00 grep Microsoft
$ ps -ef -u <유저명> | head -5
$ ps -ef -u <유저명> | tail -5
| 프로세스 강제 종료
프로세스 식별자, PID 와 프로세스명을 통해 프로세스를 강제종료하는 명령어입니다.
- kill <PID>
- killall <프로세스이름>
$ kill 7101
$ kill -9 7143
$ killAll -9 AnyDo
-9 옵션은 터미널에서 프로세스로 보내는 시그널 이며, 시그널 관련은 아래 링크를 통해 정리할게요.
각 Signal 번호는 어짜피 signal.h에 define 되어 있므로 궁금하면 /usr/include 에 있는 signal.h 파일을 참고하는 것이 좋다.| 출처: http://jangpd007.tistory.com/90▶︎ 나중에 또 볼 수 있는 요약
http://www.binarytides.com/linux-ps-command/
▶︎ The ps Command: 영문 매뉴얼
http://www.linfo.org/ps.html
지금까지 UNIX 에서 프로세스를 확인 및 종료하는 방법을 알아보았습니다. :)
딱딱한 매뉴얼을 입문자의 의식의 흐름 기법에 따라 조금더 풀어서 설명하려고 노력했는데.
저처럼 헤매고 있는 누군가에게 도움이 되었으면 좋겠습니다. ^^
유투브와 구글서치를 통해서 공부를 계속 하고 있는데요 음... 운영체제 관련 지식이 있어야할 듯해서 그 관련 책을 사서 읽어야 할까봐요 ㅎㅎ
그럼 수고하셔요 :-)
'개발입문 > 개발환경 세팅' 카테고리의 다른 글
OS X mysql root 유저 비밀번호 변경 (0) 2016.12.31 OS X MySQL 서버 설치 (0) 2016.12.30 맥 터미널 명령어 입문4: 사용자 권한 조회 몇 변경 (1) 2016.12.21 가상머신 (Virtual Box) 에 Ubuntu 설치 (입문자용) (1) 2016.12.18 맥 터미널 명령어 입문3: 네트워크 관련 명령어 (0) 2016.12.11