28.2. /proc

/proc µð·ºÅ丮´Â ½ÇÁ¦·Î´Â °¡»ó ÆÄÀϽýºÅÛÀÔ´Ï´Ù. /proc µð·ºÅ丮¿¡ µé¾î ÀÖ´Â ÆÄÀϵéÀº ÇöÀç ½ÇÇàÁßÀÎ ½Ã½ºÅÛ°ú Ä¿³Î ÇÁ·Î¼¼½º¿¡ ´ëÇÑ Á¤º¸¹× Åë°è ÀڷḦ ¹Ý¿µÇÏ°í ÀÖ½À´Ï´Ù.

bash$ cat /proc/devices
Character devices:
  1 mem
  2 pty
  3 ttyp
  4 ttyS
  5 cua
  7 vcs
 10 misc
 14 sound
 29 fb
 36 netlink
128 ptm
136 pts
162 raw
254 pcmcia

Block devices:
  1 ramdisk
  2 fd
  3 ide0
  9 md



bash$ cat /proc/interrupts
           CPU0       
  0:      84505          XT-PIC  timer
  1:       3375          XT-PIC  keyboard
  2:          0          XT-PIC  cascade
  5:          1          XT-PIC  soundblaster
  8:          1          XT-PIC  rtc
 12:       4231          XT-PIC  PS/2 Mouse
 14:     109373          XT-PIC  ide0
NMI:          0 
ERR:          0



bash$ cat /proc/partitions
major minor  #blocks  name     rio rmerge rsect ruse wio wmerge wsect wuse running use aveq

   3     0    3007872 hda 4472 22260 114520 94240 3551 18703 50384 549710 0 111550 644030
   3     1      52416 hda1 27 395 844 960 4 2 14 180 0 800 1140
   3     2          1 hda2 0 0 0 0 0 0 0 0 0 0 0
   3     4     165280 hda4 10 0 20 210 0 0 0 0 0 210 210
   ...



bash$ cat /proc/loadavg
0.13 0.42 0.27 2/44 1119
         

½© ½ºÅ©¸³Æ®´Â /proc¿¡ ÀÖ´Â ÆÄÀÏ¿¡¼­ µ¥ÀÌÅ͸¦ »Ì¾Æ³¾ ¼öµµ ÀÖ½À´Ï´Ù. [1]

kernel_version=$( awk '{ print $3 }' /proc/version )

CPU=$( awk '/model name/ {print $4}' < /proc/cpuinfo )

if [ $CPU = Pentium ]
then
  ¾î¶² ¸í·É¾î ½ÇÇà
  ...
else
  ´Ù¸¥ ¸í·É¾î ½ÇÇà
  ...
fi

/proc µð·ºÅ丮¿¡´Â º°³ª°Ôµµ ¼ýÀÚ·Î µÈ µð·ºÅ丮µéÀÌ µé¾î ÀÖ½À´Ï´Ù. ÀÌ ¼­ºê µð·ºÅ丮µéÀº ÇöÀç ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º ID¸¦ ³ªÅ¸³À´Ï´Ù. °¢ ¼­ºê µð·ºÅ丮¿¡´Â ÇØ´ç ÇÁ·Î¼¼½º¿¡ ´ëÇÑ À¯¿ëÇÑ Á¤º¸µéÀ» ´ã°í ÀÖ´Â ÆÄÀÏÀÌ µé¾î Àִµ¥, stat°ú status ÆÄÀÏÀº ÇÁ·Î¼¼½º¿¡ ´ëÇÑ Åë°è Á¤º¸¸¦ ´ã°í ÀÖ°í, cmdline ÆÄÀÏÀº ÇØ´ç ÇÁ·Î¼¼½º°¡ ½ÇÇàµÆÀ» ¶§ÀÇ ¸í·É¾î ÁÙ ÀÎÀÚ¸¦ ´ã°í ÀÖ°í, exe ÆÄÀÏÀº ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½ºÀÇ ¿ÏÀüÇÑ °æ·Î¸íÀ» ½Éº¼¸¯ ¸µÅ©ÇÏ°í ÀÖ½À´Ï´Ù. °¢ ¼­ºê µð·ºÅ丮¿¡´Â ÀÌ·±½ÄÀÇ ´Ù¸¥ ÆÄÀϵ鵵 ´õ ÀÖÁö¸¸ ½© ½ºÅ©¸³ÆÃÀÇ °üÁ¡¿¡¼­´Â ÀÌ Á¤µµ¸é ÃæºÐÇÒ °Ì´Ï´Ù.

¿¹ 28-1. ƯÁ¤ PID¿Í °ü·ÃÀÖ´Â ÇÁ·Î¼¼½º ã±â

#!/bin/bash
# pid-identifier.sh: PID¿¡ ÇØ´çÇÏ´Â ÇÁ·Î¼¼½ºÀÇ ¿ÏÀüÇÑ °æ·Î¸íÀ» ã±â.

ARGNO=1  # ÇÊ¿äÇÑ ÀÎÀÚ ¼ö.
E_WRONGARGS=65
E_BADPID=66
E_NOSUCHPROCESS=67
E_NOPERMISSION=68
PROCFILE=exe

if [ $# -ne $ARGNO ]
then
  echo "»ç¿ë¹ý: `basename $0` PID-number" >&2  # ¿¡·¯ ¸Þ¼¼Áö >Ç¥ÁØ¿¡·¯.
  exit $E_WRONGARGS
fi  

pidno=$( ps ax | grep $1 | awk '{ print $1 }' | grep $1 )
# "ps" ¸ñ·Ï¿¡¼­ pid(ù¹ø° Çʵå)¸¦ È®ÀÎ.
# ±× ´ÙÀ½¿¡´Â ÀÌ ½ºÅ©¸³Æ®°¡ ½ÇÇà½ÃŲ ÇÁ·Î¼¼½º°¡ ¾Æ´Ñ ½ÇÁ¦ ÇÁ·Î¼¼½ºÀÎÁö È®ÀÎ.
# ¸¶Áö¸·ÀÇ "grep $1"ÀÌ ÀÌ·± °¡´É¼ºÀ» Á¦°ÅÇØ ÁÝ´Ï´Ù.
if [ -z "$pidno" ]  # °á°ú°¡ ¾Æ¹«°Íµµ ¾ø´Ù¸é ±æÀÌ°¡ 0ÀÎ ¹®ÀÚ¿­ÀÌ µË´Ï´Ù.
then                # ÁÖ¾îÁø pid·Î ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º°¡ ¾øÀ½.
  echo "½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º°¡ ¾ø½À´Ï´Ù."
  exit $E_NOSUCHPROCESS
fi  

# ´ë½Å ÀÌ·¸°Ô Çصµ µË´Ï´Ù:
#   if ! ps $1 > /dev/null 2>&1
#   then                # ÁÖ¾îÁø pid·Î ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º ¾øÀ½.
#     echo "½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º°¡ ¾ø½À´Ï´Ù."
#     exit $E_NOSUCHPROCESS
#    fi

# ÀÌ Àüü °úÁ¤Àº "pidof" ¸í·É¾î·Î °£´ÜÇÏ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù.


if [ ! -r "/proc/$1/$PROCFILE" ]  # Àбâ ÆÛ¹Ì¼Ç È®ÀÎ.
then
  echo "$1 ÇÁ·Î¼¼½º´Â ½ÇÇàÁßÀÌÁö¸¸,"
  echo "/proc/$1/$PROCFILE À» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù."
  exit $E_NOPERMISSION  # ÀÏ¹Ý »ç¿ëÀÚ´Â /proc ÀÇ ¸î¸î ÆÄÀÏ¿¡ Á¢±ÙÇÒ ¼ö ¾ø½À´Ï´Ù.
fi  

# ¹Ù·Î ¾ÕÀÇ µÎ Å×½ºÆ®µéÀ» ÀÌ·¸°Ô ÇÒ ¼öµµ ÀÖ½À´Ï´Ù:
#    if ! kill -0 $1 > /dev/null 2>&1 # '0' Àº ½Ã±×³ÎÀÌ ¾Æ´Ï°í ÇØ´ç ÇÁ·Î¼¼½º¿¡ 
									  # ½Ã±×³ÎÀ» º¸³¾ ¼ö ÀÖ´ÂÁö¸¦ È®ÀÎÇؼ­ 
									  # ½ÇÇà ¿©ºÎ¸¦ ¾Ë ¼ö ÀÖ½À´Ï´Ù.
#    then echo "PID °¡ Á¸ÀçÇÏÁö ¾Ê°Å³ª ¼ÒÀ¯ÀÚ°¡ ¾Æ´Õ´Ï´Ù." >&2
#    exit $E_BADPID
#    fi



exe_file=$( ls -l /proc/$1 | grep "exe" | awk '{ print $11 }' )
# ȤÀº       exe_file=$( ls -l /proc/$1/exe | awk '{print $11}' )
#
# /proc/pid-number/exe ´Â ±× ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½ºÀÇ 
# ¿ÏÀüÇÑ °æ·Î¸í¿¡ ´ëÇÑ ½Éº¼¸¯ ¸µÅ©ÀÔ´Ï´Ù.

if [ -e "$exe_file" ]  # /proc/pid-number/exe °¡ Á¸ÀçÇÑ´Ù¸é...
then                 # ÇØ´ç ÇÁ·Î¼¼½º°¡ Á¸ÀçÇÏ´Â °ÍÀÓ.
  echo "$1 ¹ø ÇÁ·Î¼¼½º´Â $exe_file À¸·Î ½ÇÇàµÆ½À´Ï´Ù."
else
  echo "½ÇÇàÁßÀÎ ÇÁ·Î¼¼½º°¡ ¾ø½À´Ï´Ù."
fi  


# ÀÌ·¸°Ô °øÀ» µé¿© ÀÛ¼ºÇÑ ÀÌ ½ºÅ©¸³Æ®´Â 
# ps ax | grep $1 | awk '{ print $5 }'
# ·Î "°ÅÀÇ" ´ëÄ¡ °¡´ÉÇÕ´Ï´Ù.
# ÇÏÁö¸¸ 'ps'ÀÇ 5¹ø° Çʵ尡 ½ÇÇà ÆÄÀÏÀÇ °æ·ÎÀ̸§ÀÌ ¾Æ´Ï¶ó
# ±× ÇÁ·Î¼¼½ºÀÇ argv[0] À̱⠶§¹®¿¡ Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù.
#
# ÇÏÁö¸¸ ´ÙÀ½Àº Á¦´ë·Î µÉ °Ì´Ï´Ù.
#       find /proc/$1/exe -printf '%l\n'
#       lsof -aFn -p $1 -d txt | sed -ne 's/^n//p'

# Stephane Chazelas °¡ Ãß°¡ ¼³¸íÀ» ÇØ ÁÖ¾ú½À´Ï´Ù.

exit 0

¿¹ 28-2. ¿Â¶óÀÎ ¿¬°á »óÅÂ

#!/bin/bash

PROCNAME=pppd        # ppp µ¥¸ó
PROCFILENAME=status  # ãÀ» °÷
NOTCONNECTED=65
INTERVAL=2           # ¸Å 2 Ãʸ¶´Ù ¾÷µ¥ÀÌÆ®

pidno=$( ps ax | grep -v "ps ax" | grep -v grep | grep $PROCNAME | awk '{ print $1 }' )
# 'ppp µ¥¸ó'ÀÎ 'pppd'ÀÇ ÇÁ·Î¼¼½º ¹øÈ£¸¦ ã´Âµ¥,
# ±× ÇÁ·Î¼¼½º¸¦ ã±â À§ÇÑ ÇÁ·Î¼¼½º ÀÚ½ÅÀº Á¦°ÅÇØ Áà¾ß µË´Ï´Ù.
#
#  ÇÏÁö¸¸, Oleg Philon ÀÌ ÁöÀûÇßµíÀÌ,
#+ ±×³É °£´ÜÈ÷ "pidof"¸¦ ½á¼­ ¾ÆÁÖ °£´ÜÇÏ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù.
#  pidno=$( pidof $PROCNAME )
#
#  ¿©±â¼­ ¹è¿ï Á¡:
#+ ¸í·É¾îµéÀÌ ³Ê¹« º¹ÀâÇØ Áø´Ù¸é, °£´ÜÇÑ ¹æ¹ýÀ» ã¾Æ º¼ °Í.


if [ -z "$pidno" ]   # pid °¡ ¾ø´Ù¸é ±× ÇÁ·Î¼¼½º´Â ½ÇÇàÁßÀÌ ¾Æ´Ô.
then
  echo "¿¬°áÁßÀÌ ¾Æ´Õ´Ï´Ù."
  exit $NOTCONNECTED
else
  echo "¿¬°áÁßÀÔ´Ï´Ù."; echo
fi

while [ true ]       # ¹«ÇÑ ·çÇÁ, ÀÌ ºÎºÐÀº Á» ´õ °³¼±µÉ ¼ö ÀÖ½À´Ï´Ù.
do

  if [ ! -e "/proc/$pidno/$PROCFILENAME" ]
  # ÇÁ·Î¼¼½º°¡ ½ÇÇàÁßÀ̸é, "status" ÆÄÀϵµ Á¸ÀçÇÕ´Ï´Ù.
  then
    echo "¿¬°áÀÌ ²÷¾îÁ³½À´Ï´Ù."
    exit $NOTCONNECTED
  fi

netstat -s | grep "packets received"  # ¸î °¡Áö Á¢¼Ó Åë°è.
netstat -s | grep "packets delivered"


  sleep $INTERVAL
  echo; echo

done

exit 0

# ÀÌ ½ºÅ©¸³Æ®´Â Control-C ·Î¸¸ ³¡³¾ ¼ö ÀÖ½À´Ï´Ù.

#    µ¶ÀÚµéÀ» À§ÇÑ ¿¬½À¹®Á¦:
#    "q"¸¦ ´­·¶À» ¶§ Á¾·áÇϵµ·Ï °³¼±½ÃÄÑ º¸¼¼¿ä.
#    »ç¿ëÀÚ°¡ Á» ´õ ¾²±â ÁÁ°Ô(user-friendly) ¸¸µé¾î º¸¼¼¿ä.

ÁÖÀÇ

º¸Åë, /proc ¹Ø¿¡ ÀÖ´Â ÆÄÀÏ¿¡ ¾²±â¸¦ Çϸé, ÆÄÀÏ ½Ã½ºÅÛÀ» ¼Õ»ó ½Ãų ¼öµµ ÀÖ°í ½Ã½ºÅÛÀ» ¸Á°¡Æ®¸± ¼öµµ Àֱ⠶§¹®¿¡ À§ÇèÇÕ´Ï´Ù.

ÁÖ¼®

[1]

procinfo, free, vmstat, lsdev, uptime °°Àº ¸í·É¾îµéÀÌ ÀÌ·¸°Ô µ¿ÀÛÇÕ´Ï´Ù.