본문으로 바로가기

[Linux] 리눅스 프로세스 상태 확인하기 - ps

category OS/Linux 2021. 9. 20. 22:48

목차

    1. ps 명령어

    [개요]
    
    # ps [options]

     현재 실행되고 있는 프로세스들의 정보를 표시

     Process Status

     주로 "ps -ef | grep 프로세스 정보" 형태로 많이 사용합니다.

    1.1. ps 옵션(주요 옵션)

     매우 많고 다양한 옵션이 있으나 주로 쓰이는 옵션은 정해져 있어 주요 옵션만 작성하였습니다.

    [OPTIONS]

     -e

      : 모든(every) 프로세스를 출력합니다. ( -A 옵션과 동일합니다.)

     -f

      : 전체(full) 형식의 필드 목록을 출력합니다. 

      : UID, PID, PPID, C, STIME, TTY, TIME, CMD 필드를 출력합니다.

     -l

      : 긴(long) 형식의 필드 목록을 출력합니다.

      : F, S, UID, PID, PPID, C, PRI, NI, ADDR, SZ, WCHAN, TTY, TIME, CMD 필드를 출력합니다.

     -p pid

      : 프로세스 번호를 지정해 출력합니다.

     -u user

      : 사용자 정보를 지정해 출력합니다.

     -C command

      : 명령어 이름을 지정해 출력합니다.

     -o 형식 1, 형식 2,...

      : 사용자 정의 형태로 출력

      : EX) ps -e -o pid,ppid,uname,pcpu,pmem,comm,tty

    1.2. 프로세스의 구성요소

    리눅스 프로세스의 구성요소

     


    2. ps 명령어 예제

    2.1. 현재 터미널에서 실행한 사용자 프로세스의 대한 정보를 출력

    # ps

    # ps
      PID TTY          TIME CMD
     6350 pts/1    00:00:01 bash
    16495 pts/1    00:00:00 ps
    
    [프로세스 확인을 위해 백그라운드에서 실행]
    # vi a.txt &
    [1] 16663
    
    # ps
      PID TTY          TIME CMD
     6350 pts/1    00:00:01 bash
    16663 pts/1    00:00:00 vi
    16672 pts/1    00:00:00 ps
    
    # ps -f
    UID        PID  PPID  C STIME TTY          TIME CMD
    root      6350  6330  0 18:48 pts/1    00:00:01 -bash
    root     16663  6350  0 21:32 pts/1    00:00:00 vi a.txt
    root     16729  6350  0 21:33 pts/1    00:00:00 ps -f
    
    # ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0  6350  6330  0  80   0 - 29141 do_wai pts/1    00:00:01 bash
    0 T     0 16663  6350  0  80   0 - 31076 do_sig pts/1    00:00:00 vi
    0 R     0 16732  6350  0  80   0 - 38331 -      pts/1    00:00:00 ps
    
    # ps -lf
    F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
    4 S root      6350  6330  0  80   0 - 29141 do_wai 18:48 pts/1    00:00:01 -bash
    0 T root     16663  6350  0  80   0 - 31076 do_sig 21:32 pts/1    00:00:00 vi a.txt
    0 R root     17507  6350  0  80   0 - 38862 -      21:47 pts/1    00:00:00 ps -lf

    2.2. 전체 프로세스 정보 출력

    # ps -e

    # ps -e
      PID TTY          TIME CMD
        1 ?        02:59:23 systemd
        2 ?        00:00:30 kthreadd
        4 ?        00:00:00 kworker/0:0H
        6 ?        00:05:03 ksoftirqd/0
    ( ... ) 생략
    
    # ps -ef
    UID        PID  PPID  C STIME TTY          TIME CMD
    root         1     0  0  2020 ?        02:59:23 /usr/lib/systemd/systemd --system --deserialize 20
    root         2     0  0  2020 ?        00:00:30 [kthreadd]
    root         4     2  0  2020 ?        00:00:00 [kworker/0:0H]
    root         6     2  0  2020 ?        00:05:03 [ksoftirqd/0]
    ( ... ) 생략
    
    # ps -el
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0     1     0  0  80   0 - 48559 ep_pol ?        02:59:23 systemd
    1 S     0     2     0  0  80   0 -     0 kthrea ?        00:00:30 kthreadd
    1 S     0     4     2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H
    1 S     0     6     2  0  80   0 -     0 smpboo ?        00:05:03 ksoftirqd/0
    ( ... ) 생략
    
    # ps -efl
    F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
    4 S root         1     0  0  80   0 - 48559 ep_pol  2020 ?        02:59:23 /usr/lib/systemd/systemd --system --deserialize 20
    1 S root         2     0  0  80   0 -     0 kthrea  2020 ?        00:00:30 [kthreadd]
    1 S root         4     2  0  60 -20 -     0 worker  2020 ?        00:00:00 [kworker/0:0H]
    1 S root         6     2  0  80   0 -     0 smpboo  2020 ?        00:05:03 [ksoftirqd/0]
    ( ... ) 생략

    2.3. 프로세스 번호, 사용자 이름, 명령어 이름을 이용해 프로세스 정보 출력

    프로세스 번호

    # ps -p pid

     

    사용자 이름

    # ps -u username

     

    명령어 이름

    # ps -C command

    # ps -p 1
      PID TTY          TIME CMD
        1 ?        00:05:50 systemd
    
    # ps -u apache
      PID TTY          TIME CMD
    25537 ?        00:00:00 httpd
    25538 ?        00:00:00 httpd
    25539 ?        00:00:00 httpd
    25540 ?        00:00:00 httpd
    25541 ?        00:00:00 httpd
    
    # ps -C vi
      PID TTY          TIME CMD
     2399 ?        00:00:00 vi
    16663 pts/1    00:00:00 vi

    2.4. 원하는 형태로 프로세스 정보 출력

    # ps -o 형식 1, 형식 2,...

    [현재 터미널에서 실행한 프로세스의 PID, PPID, COMMAND, Status, StartTime 정보 출력]
    # ps -o pid,ppid,comm,s,stime
      PID  PPID COMMAND         S STIME
     6350  6330 bash            S 18:48
    16663  6350 vi              T 21:32
    17835  6350 ps              R 21:52
    
    [전체 프로세스의 PID, PPID, COMMAND, Status, StartTime 정보 출력]
    # ps -e -o pid,ppid,comm,s,stime
      PID  PPID COMMAND         S STIME
        1     0 systemd         S  9월07
        2     0 kthreadd        S  9월07
        4     2 kworker/0:0H    S  9월07
        6     2 ksoftirqd/0     S  9월07
    ( ... ) 생략

    2.4. head, tail, more를 이용해 출력

    프로세스 정보가 매우 많은 경우 | (파이프라인)을 이용해 화면에 출력되는 양을 조절합니다.

     

    # ps | head

    # ps | tail

    # ps | more

    • 간단하게 head, tail, more 명령어 사용법을 아래에 작성했습니다.

    2.4.1. head

    파일 첫 부분부터 출력

    # head [OPTION]... [FILE]...

     

    [OPTIONS]

     -n

      : 위에서부터 출력할 행을 지정합니다.

    2.4.2. tail 

    파일 뒷부분부터 출력

    # tail [OPTION]... [FILE]...

     

    [OPTIONS]

     -n

      : 위에서부터 출력할 행을 지정합니다.

     -f

      : 파일 상태 감시

    2.4.3. more

    화면 단위로 끊어서 출력

    # more [FILE]

     

    [COMMAND]

     enter

      : 1행 아래로 이동

     d

      : 반 페이지씩 넘어간다.

     space bar, z

      : 1페이지씩 넘어간다.

     f 

      : 2 페이지씩 넘어간다.

     b

      : 이전 페이지로 돌아간다.

     =

      : 현재 위치의 행 번호 표시

     /문자열

      : 지정한 문자열 검색

     v

      : 현재 열려있는 파일의 현재 위치에서 vi 편집기 실행

     q

      : more 명령어 종료

    [위에서부터 5줄 출력]
    # ps -ef | head -n 5 | cat -n
         1  UID        PID  PPID  C STIME TTY          TIME CMD
         2  root         1     0  0  9월07 ?      00:05:51 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
         3  root         2     0  0  9월07 ?      00:00:00 [kthreadd]
         4  root         4     2  0  9월07 ?      00:00:00 [kworker/0:0H]
         5  root         6     2  0  9월07 ?      00:00:15 [ksoftirqd/0]
    
    [아래에서부터 5줄 출력]
    # ps -ef | tail -n 5 | cat -n
         1  apache   25539 10626  0  9월19 ?      00:00:00 /usr/sbin/httpd -DFOREGROUND
         2  apache   25540 10626  0  9월19 ?      00:00:00 /usr/sbin/httpd -DFOREGROUND
         3  apache   25541 10626  0  9월19 ?      00:00:00 /usr/sbin/httpd -DFOREGROUND
         4  mysql    31621     1  0  9월13 ?      00:00:00 /bin/sh /usr/local/mariadb-10.0.31/bin/mysqld_safe --datadir=/usr/local/mariadb-10.0.31/data --pid-file=/usr/local/mariadb-10.0.31/data/localhost.localdomain.pid
         5  mysql    31695 31621  0  9월13 ?      00:03:09 /usr/local/mariadb-10.0.31/bin/mysqld --basedir=/usr/local/mariadb-10.0.31 --datadir=/usr/local/mariadb-10.0.31/data --plugin-dir=/usr/local/mariadb-10.0.31/lib/plugin --log-error=/usr/local/mariadb-10.0.31/data/localhost.localdomain.err --pid-file=/usr/local/mariadb-10.0.31/data/localhost.localdomain.pid
    
    [명령어를 이용해 페이지 이동]
    # ps -ef | more
    UID        PID  PPID  C STIME TTY          TIME CMD
    root         1     0  0  9월07 ?      00:05:52 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root         2     0  0  9월07 ?      00:00:00 [kthreadd]
    root         4     2  0  9월07 ?      00:00:00 [kworker/0:0H]
    ( ... ) 생략
    root       107     2  0  9월07 ?      00:00:00 [kauditd]
    root       288     2  0  9월07 ?      00:00:00 [ata_sff]
    root       291     2  0  9월07 ?      00:00:00 [scsi_eh_0]
    --More--

    2.5. grep을 이용해 원하는 정보 출력

    ★ 가장 많이 사용하는 형태입니다.

    |(파이프라인) 전에 ps 명령어로 출력될 내용을 바탕으로 원하는 정보를 출력할 수 있습니다.

    # ps | grep 원하는 정보

    # ps
      PID TTY          TIME CMD
     6350 pts/1    00:00:01 bash
    16663 pts/1    00:00:00 vi
    19933 pts/1    00:00:00 ps
    
    # ps | grep 6350
     6350 pts/1    00:00:01 bash
     
     # ps | grep pts/1
     6350 pts/1    00:00:01 bash
    16663 pts/1    00:00:00 vi
    19981 pts/1    00:00:00 ps
    19982 pts/1    00:00:00 grep
    
    # ps | grep vi
    16663 pts/1    00:00:00 vi
    
    # ps | grep -v "bash"
      PID TTY          TIME CMD
    16663 pts/1    00:00:00 vi
    20177 pts/1    00:00:00 ps
    20178 pts/1    00:00:00 grep

    2.6. 프로세스 죽이기(kill)

    • ps 명령어를 통해 PID를 확인하여 프로세스를 kill 할 수 있습니다.

     실제로는 프로세스에 시그널(signal)을 보내는 명령어입니다. (종료 시그널(9)을 보내 종료)

    # kill [ -s signal | -p ] [ -a ] [ -- ] pid ...

    # kill -signal pid ...

    [시그널 번호 종류]
    # kill -l
     1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
     6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
    11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
    16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
    21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
    26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
    31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
    38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
    43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
    53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
    58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
    63) SIGRTMAX-1  64) SIGRTMAX
    # ps
      PID TTY          TIME CMD
     6350 pts/1    00:00:01 bash
    20805 pts/1    00:00:00 vi
    20807 pts/1    00:00:00 ps
    
    [vi 명령어 kill 하기]
    # kill -9 20805
    or
    # kill -s 9 20805
    [1]+  Stopped                 vi a.txt

    2.7. 특정 이름의 프로세스 죽이기(kill)

    # kill -9 `ps -ef | grep 프로세스 | grep -v grep | awk '{print $2}'`

    # ps
      PID TTY          TIME CMD
     6350 pts/1    00:00:01 bash
    21281 pts/1    00:00:00 vi
    21383 pts/1    00:00:00 ps
    
    [vi kill]
    # kill -9 `ps -f | grep vi | grep -v grep | awk '{print $2}'`
    [1]+  죽었음               vi a.txt