½© ½ºÅ©¸³Æ®ÀÇ °¡Àå °£´ÜÇÑ ¿¹´Â ½ºÅ©¸³Æ® ÆÄÀÏ¿¡ ½Ã½ºÅÛ ¸í·É¾îµéÀ» ´Ü¼øÈ÷ ³ª¿ÇØ ³õ´Â °ÍÀÔ´Ï´Ù. ÀÌ·¸°Ô Çϸé Àû¾îµµ, ƯÁ¤ÇÑ ¼ø¼·Î ¸í·É¾î¸¦ ½ÇÇà½ÃÄÑ¾ß ÇÒ ¶§ ´Ù½Ã Ä¡´Â ¼ö°í¸¦ ´ú¾î ÁÝ´Ï´Ù.
¿¹ 2-1. cleanup: /var/log ¿¡ ÀÖ´Â ·Î±× ÆÄÀϵéÀ» û¼ÒÇÏ´Â ½ºÅ©¸³Æ®
# cleanup # ·çÆ®·Î ½ÇÇà½ÃŰ¼¼¿ä. cd /var/log cat /dev/null > messages cat /dev/null > wtmp echo "·Î±×¸¦ Á¤¸®Çß½À´Ï´Ù." |
º° ´Ù¸¥°Ô ¾øÁÒ? ´Ü¼øÈ÷ ÄܼÖÀ̳ª ÇÑÅÒ¿¡¼ ½±°Ô ½ÇÇà ½Ãų ¼ö ÀÖ´Â ¸í·É¾îµéÀÇ Á¶ÇÕÀÔ´Ï´Ù. ¸í·É¾îµéÀ» ½ºÅ©¸³Æ® »ó¿¡¼ ½ÇÇà½ÃŰ´Â °ÍÀº À̵éÀ» ´Ù½Ã Ä¡Áö ¾Ê¾Æµµ µÈ´Ù´Â °Í ÀÌ»óµµ ÀÌÇϵµ ¾Æ´Õ´Ï´Ù. ½ºÅ©¸³Æ®´Â ƯÁ¤ÇÑ ÀÀ¿ë¿¡ ´ëÇØ ½±°Ô °íÄ¡°í ÀÔ¸À¿¡ ¸Â°Ô ¼öÁ¤Çϰí ÀϹÝÈ ½Ãų ¼ö ÀÖ½À´Ï´Ù.
¿¹ 2-2. cleanup: À§ ½ºÅ©¸³Æ®ÀÇ Çâ»óµÇ°í ÀϹÝÈµÈ ¹öÀü.
#!/bin/bash # cleanup, version 2 # ·çÆ®·Î ½ÇÇà½ÃŰ¼¼¿ä. LOG_DIR=/var/log ROOT_UID=0 # $UID°¡ 0ÀÎ À¯Àú¸¸ÀÌ ·çÆ® ±ÇÇÑÀ» °®½À´Ï´Ù. LINES=50 # ±âº»ÀûÀ¸·Î ÀúÀåÇÒ ÁÙ ¼ö. E_XCD=66 # µð·ºÅ丮¸¦ ¹Ù²Ü ¼ö ¾ø´Ù? E_NOTROOT=67 # ·çÆ®°¡ ¾Æ´Ò °æ¿ìÀÇ Á¾·á ¿¡·¯. if [ "$UID" -ne "$ROOT_UID" ] then echo "ÀÌ ½ºÅ©¸³Æ®´Â ·çÆ®·Î ½ÇÇà½ÃÄÑ¾ß µË´Ï´Ù." exit $E_NOTROOT fi if [ -n "$1" ] # ¸í·É¾îÁÙ ÀÎÀÚ°¡ Á¸ÀçÇÏ´ÂÁö Å×½ºÆ®(non-empty). then lines=$1 else lines=$LINES # ¸í·É¾îÁÙ¿¡¼ ÁÖ¾îÁöÁö ¾Ê¾Ò´Ù¸é µðÆúÆ®°ªÀ» ¾¸. fi # Stephane Chazelas °¡ ¸í·É¾îÁÙ ÀÎÀÚ¸¦ È®ÀÎÇÏ´Â ´õ ÁÁÀº ¹æ¹ýÀ» #+ Á¦¾ÈÇØ ÁÖ¾ú´Âµ¥ Áö±Ý ´Ü°è¿¡¼´Â ¾à°£ ¾î·Á¿î ÁÖÁ«´Ï´Ù. # # E_WRONGARGS=65 # ¼ýÀÚ°¡ ¾Æ´Ñ ÀÎÀÚ.(Ʋ¸° ÀÎÀÚ Æ÷¸Ë) # # case "$1" in # "" ) lines=50;; # *[!0-9]*) echo "»ç¿ë¹ý: `basename $0` Á¤¸®ÇÒÆÄÀÏ"; exit $E_WRONGARGS;; # * ) lines=$1;; # esac # #* À̰ÍÀ» ÀÌÇØÇÏ·Á¸é "·çÇÁ" ÀýÀ» Âü°íÇϼ¼¿ä. cd $LOG_DIR if [ `pwd` != "$LOG_DIR" ] # ȤÀº if [ "$PWD" != "LOG_DIR" ] # /var/log ¿¡ ÀÖÁö ¾Ê´Ù? then echo "$LOG_DIR ·Î ¿Å°Ü°¥ ¼ö ¾ø½À´Ï´Ù." exit $E_XCD fi # ·Î±×ÆÄÀÏÀÌ µÚÁ×¹ÚÁ׵DZâ Àü¿¡ ¿Ã¹Ù¸¥ µð·ºÅ丮¿¡ ÀÖ´ÂÁö µÎ¹ø È®ÀÎÇÔ. # ´õ ÁÁÀº ¹æ¹ýÀº: # --- # cd /var/log || { # echo "ÇÊ¿äÇÑ µð·ºÅ丮·Î ¿Å°Ü°¥ ¼ö ¾ø½À´Ï´Ù." >&2 # exit $E_XCD; # } tail -$lines messages > mesg.temp # message ·Î±× ÆÄÀÏÀÇ ¸¶Áö¸· ºÎºÐÀ» ÀúÀå. mv mesg.temp messages # »õ ·Î±× ÆÄÀÏÀÌ µÊ. # cat /dev/null > messages #* À§ÀÇ ¹æ¹ýÀÌ ´õ ¾ÈÀüÇϴϱî ÇÊ¿ä ¾øÀ½. cat /dev/null > wtmp # > wtemp ¶ó°í ÇØµµ °°Àº °á°ú. echo "·Î±×°¡ Á¤¸®µÆ½À´Ï´Ù." exit 0 # ½ºÅ©¸³Æ® Á¾·á½Ã¿¡ 0À» ¸®ÅÏÇϸé #+ ½©¿¡°Ô ¼º°øÇß´Ù°í ¾Ë·ÁÁÜ. |
½Ã½ºÅÛ ·Î±× Àüü¸¦ ³¯·Á ¹ö¸± »ý°¢ÀÌ ¾øÀ» Å×´Ï±î ¿©±â¼´Â message ·Î±×ÀÇ ¸¶Áö¸· ºÎºÐÀ» ±×´ë·Î ³²°Ü ³õ½À´Ï´Ù. ¾ÕÀ¸·Î´Â ÀÌ·¸°Ô ¾Õ¼ ½è´ø ½ºÅ©¸³Æ®¸¦ °¡°øÇؼ ´Ù½Ã ¾²´Â ½ÄÀÇ Á» ´õ È¿°úÀûÀÎ ¹æ¹ýÀ» °è¼Ó º¸°Ô µÉ °ÍÀÔ´Ï´Ù.
The #! Àº ½ºÅ©¸³Æ®ÀÇ Á¦ÀÏ ¾Õ¿¡¼ ÀÌ ÆÄÀÏÀÌ ¾î¶² ¸í·É¾î ÇØ¼®±âÀÇ ¸í·É¾î ÁýÇÕÀÎÁö¸¦ ½Ã½ºÅÛ¿¡°Ô ¾Ë·ÁÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. #! Àº µÎ ¹ÙÀÌÆ® [1] ÀÇ "¸ÅÁ÷ ³Ñ¹ö"(magic number)·Î¼, ½ÇÇà °¡´ÉÇÑ ½© ½ºÅ©¸³Æ®¶ó´Â °ÍÀ» ³ªÅ¸³»´Â Ưº°ÇÑ Ç¥½ÃÀÚÀÔ´Ï´Ù(man magicÀ» Çϸé Àç¹ÌÀÖ´Â ÁÖÁ¦ÀÇ À̾߱âµéÀ» º¼ ¼ö ÀÖ½À´Ï´Ù). #! ¹Ù·Î µÚ¿¡ ³ª¿À´Â °ÍÀº °æ·Î¸íÀ¸·Î, ½ºÅ©¸³Æ®¿¡ µé¾îÀÖ´Â ¸í·É¾îµéÀ» ÇØ¼®ÇÒ ÇÁ·Î±×·¥ÀÇ À§Ä¡¸¦ ³ªÅ¸³»´Âµ¥ ±× ÇÁ·Î±×·¥ÀÌ ½©ÀÎÁö, ÇÁ·Î±×·¥ ¾ð¾îÀÎÁö, À¯Æ¿¸®Æ¼ÀÎÁö¸¦ ³ªÅ¸³À´Ï´Ù. ÀÌ ¸í·É¾î ÇØ¼®±â°¡ ÁÖ¼®Àº ¹«½ÃÇÏ¸é¼ ½ºÅ©¸³Æ®ÀÇ Ã¹ ¹øÂ° ÁÙºÎÅÍ ¸í·É¾îµéÀ» ½ÇÇà½Ãŵ´Ï´Ù. [2]
#!/bin/sh #!/bin/bash #!/usr/bin/perl #!/usr/bin/tcl #!/bin/sed -f #!/usr/awk -f |
°¢°¢ÀÇ ÁÙÀº ±âº» ½©ÀÎ /bin/shÀ̳ª ±âº»½©(¸®´ª½º¿¡¼´Â bash), ȤÀº ´Ù¸¥ ¸í·É¾î ÇØ¼®±â¸¦ ºÎ¸£°í ÀÖ½À´Ï´Ù. [3] °ÅÀÇ ´ëºÎºÐÀÇ »ó¾÷¿ë À¯´Ð½º º¯Á¾¿¡¼ ±âº» º»½©ÀÎ #!/bin/shÀ» ¾²¸é ºñ·Ï Bash ¸¸ °¡Áö°í ÀÖ´Â ¸î¸î ±â´ÉµéÀ» ¸ø ¾²°Ô µÇ°ÚÁö¸¸ ¸®´ª½º°¡ ¾Æ´Ñ ´Ù¸¥ ¸Ó½Å¿¡ ½±°Ô À̽Ä(port)ÇÒ ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù(ÀÌ·¸°Ô ÀÛ¼ºµÈ ½ºÅ©¸³Æ®´Â POSIX [4] sh Ç¥ÁØÀ» µû¸£°Ô µË´Ï´Ù.
"#!" µÚ¿¡ ³ª¿À´Â °æ·Î´Â Á¤È®ÇØ¾ß ÇÕ´Ï´Ù. ¸¸¾à À̸¦ Ʋ¸®°Ô Àû´Â´Ù¸é ½ºÅ©¸³Æ®¸¦ µ¹·ÈÀ» ¶§ °ÅÀÇ ´ëºÎºÐ "Command not found"¶ó´Â ¿¡·¯ ¸Þ¼¼Áö¸¸ º¸°Ô µÉ °ÍÀÔ´Ï´Ù.
½ºÅ©¸³Æ®¿¡¼ ³»ºÎ ½© Áö½ÃÀÚ¸¦ ¾È ¾²°í ÀϹÝÀûÀÎ ½Ã½ºÅÛ ¸í·Éµé¸¸ ¾´´Ù¸é #!´Â ¾È ½áµµ ±¦Âú½À´Ï´Ù. À§ÀÇ 2¹ø ¿¹Á¦¿¡¼´Â #!ÀÌ ÇÊ¿äÇѵ¥, lines=50À̶ó´Â ½© Àü¿ë »ý¼ºÀÚ¸¦ ½á¼ º¯¼ö¿¡ °ªÀ» ´ëÀÔÇϰí Àֱ⠶§¹®ÀÔ´Ï´Ù. #!/bin/shÀÌ ¸®´ª½º¿¡¼ ±âº» ½© ÇØ¼®±âÀÎ /bin/bashÀ» ºÎ¸£°í ÀÖ´Â °Í¿¡ ÁÖÀÇÇϽʽÿÀ.
Áß¿ä: ÀÌ Æ©Å丮¾óÀº ½ºÅ©¸³Æ®¸¦ ¸¸µé ¶§ ¸ðµâº° Á¢±Ù ¹æ½ÄÀ» »ç¿ëÇϵµ·Ï À¯µµÇÕ´Ï´Ù. ³ªÁß¿¡ À¯¿ëÇÏ°Ô ¾µ ¼ö ÀÖ¾î º¸À̰í "ÀÚÁÖ µîÀå"(boilerplate)ÇÏ´Â ÄÚµå Á¶°¢µéÀ» ¸ð¾Æ µÎ¼¼¿ä. ÀÌ·¸°Ô ¸ð¾ÆµÎ¸é ³ªÁß¿¡ ¾ÆÁÖ ´Ù¾çÇÏ°í ¸Å·ÂÀûÀÎ ·çƾµéÀ» ¸¸µé ¼ö ÀÖÀ» °Ì´Ï´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ ½ºÅ©¸³Æ® Á¶°¢Àº ½ºÅ©¸³Æ® ½ÃÀÛ ºÎºÐ¿¡ µÎ¾î¼ ¿øÇÏ´Â ¼ö ¸¸ÅÀÇ ¸Å°³º¯¼ö¸¦ ¹Þ¾Ò´ÂÁö È®ÀÎÇϴµ¥ ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù.
if [ $# -ne ¿øÇÏ´Â_¸Å°³º¯¼ö_°¹¼ö ] then echo "»ç¿ë¹ý: `basename $0` ¾î¼±¸Àú¼±¸" exit $WRONG_ARGS fi
[1] | ¸î¸î À¯´Ð½º ¹öÀü(4.2BSD ¿¡ ±â¹ÝÇÑ)¿¡¼´Â ¸ÅÁ÷ ³Ñ¹ö·Î 4 ¹ÙÀÌÆ®¸¦ ¹Þ¾ÆµéÀ̱⠶§¹®¿¡ ! ´ÙÀ½¿¡ ºó ÄÀÌ ÇÊ¿äÇÕ´Ï´Ù. #! /bin/sh. | |
[2] | ÇØ´ç ¸í·É¾î ÇØ¼®±â(shÀ̳ª bash)´Â #!ÀÌ ÀÖ´Â ÁÙÀ» óÀ½ ÇØ¼®ÇÏ·Á°í ÇÒÅÙµ¥, ÀÌ ÁÙÀº ÀÌ¹Ì ¸í·É¾î ÇØ¼®±â¸¦ ºÎ¸£´Â ÀÚ½ÅÀÇ ¿ªÇÒÀ» ¼öÇàÇß°í #À¸·Î ½ÃÀÛÇϱ⠶§¹®¿¡ ÁÖ¼®À¸·Î ¿Ã¹Ù¸£°Ô ÇØ¼®µÉ °ÍÀÔ´Ï´Ù. | |
[3] | ±×·¡¼ ÀÌ·¸°Ô ¸ÚÁø Æ®¸¯µµ °¡´ÉÇØ Áý´Ï´Ù.
Àç¹ÌÀÖ´Â°Ô ¶Ç Àִµ¥, README ÆÄÀÏÀÇ ½ÃÀÛ ºÎºÐ¿¡ #!/bin/more ¶ó°í Àû°í ½ÇÇà ÆÛ¹Ì¼ÇÀ» ÁÖ¸é, Àڱ⠽º½º·Î ³»¿ëÀ» º¸¿©ÁÖ´Â ¹®¼ ÆÄÀÏÀÌ µË´Ï´Ù. | |
[4] | Portable Operating System Interface, À¯´Ð½º·ùÀÇ OSµéÀ» À§ÇÑ Ç¥ÁØÈ ÀÛ¾÷ |