리눅스 procfs 질문입니다!

조회수 2575회

리눅스의 procfs 의 파일들만 이용하여 ps 명령어를 구현하고 싶은데 어떻게 하면 될까요?

리눅스에서 ps aux 와 비슷하게 출력해주고 싶은데 고수님들 답변 기다리겠습니다ㅜㅜ

ps aux 실행결과


root@raspberrypi:/proc# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.4   5420  3964 ?        Ss   14:16   0:04 /sbin/init
root         2  0.0  0.0      0     0 ?        S    14:16   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    14:16   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   14:16   0:00 [kworker/0:0H]
root         7  0.0  0.0      0     0 ?        S    14:16   0:00 [rcu_sched]
root         8  0.0  0.0      0     0 ?        S    14:16   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    14:16   0:00 [migration/0]
root        10  0.0  0.0      0     0 ?        S    14:16   0:00 [migration/1]
root        11  0.0  0.0      0     0 ?        S    14:16   0:00 [ksoftirqd/1]
root        13  0.0  0.0      0     0 ?        S<   14:16   0:00 [kworker/1:0H]
root        14  0.0  0.0      0     0 ?        S    14:16   0:00 [migration/2]
root        15  0.0  0.0      0     0 ?        S    14:16   0:00 [ksoftirqd/2]
root        17  0.0  0.0      0     0 ?        S<   14:16   0:00 [kworker/2:0H]
root        18  0.0  0.0      0     0 ?        S    14:16   0:00 [migration/3]
root        19  0.0  0.0      0     0 ?        S    14:16   0:00 [ksoftirqd/3]
root        21  0.0  0.0      0     0 ?        S<   14:16   0:00 [kworker/3:0H]
root        22  0.0  0.0      0     0 ?        S<   14:16   0:00 [khelper]
root        23  0.0  0.0      0     0 ?        S    14:16   0:00 [kdevtmpfs]
root        24  0.0  0.0      0     0 ?        S<   14:16   0:00 [netns]
root        25  0.0  0.0      0     0 ?        S<   14:16   0:00 [perf]

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • (수정) /proc 에서 얻을려면 경로 패턴 "/proc/[숫자]/[부분경로]"을 이해하시면 됩니다. 우선 proc man page 문서를 참고해보세요.

    1. 숫자 : PID 에 해당합니다.
    2. 부분경로 : 여러개의 파일이 있습니다. 질문에 올려주신 예에 해당하는 파일만 설명하면 다음과 같습니다.
    3. %MEM은 계산하셔야 합니다. 참고 링크1, 참고 링크2
    4. TTY는 장치 번호로 판단하셔야 합니다. 리눅스 장치는 major 번호와 minor 번호로 구성되는데 위 링크를 보시면 tty에 대한 장치 번호 정보가 있습니다. (직접 얻을 수 있는 방법은... 잘 모르겠네요.)
    5. %CPU는 이 링크를 참고하세요.

    부분경로

    status 파일

    • VmSize: -> VSZ
    • VmRSS: -> RSS

    stat 파일 : 프로세스 정보

    3193 (VBoxHeadless) S 3135 3193 3134 0 -1 4202496 360568 0 406 0 3041427 6421688 0 0 20 0 25 0 3228 2759557120 302185 18446744073709551615 4194304 4218588 140736234964176 140736234950688 139806890640307 0 8192 4096 73728 18446744073709551615 0 0 17 12 0 0 8 0 0
    
    • 앞의 링크에서 주요한 stat 파일의 정보는 아래와 같습니다. (순서는 링크를 참고하세요)
      • Pid %d: process ID
      • Comm %s: 괄호 안은 실행 파일 이름(경로 제외)
      • State %c: RSDZTW중 한 개의 문자. R은 running, S는 인터럽트 가능한 대기(sleeping), D는 인터럽트 불가능한 I/O 대기중, Z는 좀비, T는 traced or stopped (on a signal), 마지막으로 W 는 페이징중.
      • Starttime %llu: START와 TIME에 해당
      • Vsize %lu: 위의 VSZ 항목
      • Rss %ld: 위의 RSS 항목

    statm 파일 :이 파일은 메모리 사용정보입니다.

    905095 532797 529991 6 0 312198 0
    
    • 파일의 내용은 다음과 같습니다.
      • size :total program size (= VmSize in /proc/[pid]/status -> VSZ)
      • resident : resident set size (= VmRSS in /proc/[pid]/status -> RSS)
      • share : shared pages (i.e., backed by a file)
      • text : text (code)
      • lib : library (unused in Linux 2.6)
      • data : data + stack
      • dt : dirty pages (unused in Linux 2.6) - List item

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)