ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 맥 터미널 명령어 입문5: 프로세스 확인, 종료
    개발입문/개발환경 세팅 2016. 12. 22. 00:36

    안녕하세요 :) 


    컴퓨터가 먹통일 때 작업관리자에서 실행중인 응용프로그램을 확인하고 응용프로그램이 응답없음 상태인 대상을 콕 집어서 강제종료 한 적 있으시죠? 폰에서도 앱끼리 충돌이 나서 반응이 없을 때, 홈버튼을 통해 강제로 실행중인 애플리케이션을 날려본 적 있으시죠?  응답없음 상태는 과부하를 주는 작업을 요청했거나, 프로세스 간 충돌을 일으켰을 때 가끔 확인할 수 있습니다. 


    이번 포스트에서는 맥 터미널, 유닉스 UNIX 환경에서 에서 프로세스를 확인 및 종료하는 방법을 살펴보겠습니다. 

    역시나 저의 공부이므로 운영체제 기본부터 차근히 정리해보겠습니다. :3


    | 커널과 프로세스 이론

    운영체제의 핵심인 커널(Kernel)

    컴퓨터 리소스 (CPU, Memory, Devices etc.)를 이용하여

    프로그램 (Applications)를 실행합니다. 


    - 프로그램: 실행가능한  소스코드 모음

    - 프로세스: 컴퓨터가 리소스를 통해 실행하고 있는 작업 단위


    프로그램은 실행할 수 있는 파일(소스코드 모음)을 말하며 일단 실행되면 (메모리에 올라와 CPU를 할당받고 실행되고 있는 상태이면) 프로세스라고 부릅니다. 커널은 동시에 여러 프로세스에게 자원을 할당합니다. 리소스 관리(할당 및 할당해제, 스케쥴링 등) 효율적으로 하면서 사용자가 느끼기에 마치 커널이 여러 프로세스를 동시에 실행시키고 있는 것처럼 느끼도록 합니다. 



    운영체제 실행구조운영체제 실행 레이어     

    프로세스 상태 Process StatusOS의 프로세스 관리




    ▶︎ 프로세스에 대해 더 잘 알고 싶다면-

    운영체제 프로세스 정리 |  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.html


    3. 셸 실행 프로세스 확인 

    셸 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 에서 프로세스를 확인 및 종료하는 방법을 알아보았습니다. :) 

    딱딱한 매뉴얼을 입문자의 의식의 흐름 기법에 따라 조금더 풀어서 설명하려고 노력했는데.

    저처럼 헤매고 있는 누군가에게 도움이 되었으면 좋겠습니다. ^^ 


    유투브와 구글서치를 통해서 공부를 계속 하고 있는데요 음... 운영체제 관련 지식이 있어야할 듯해서 그 관련 책을 사서 읽어야 할까봐요 ㅎㅎ 

    그럼 수고하셔요 :-)







    댓글

Designed by Tistory.