UNIX 시스템에 필요한 10가지 핵심 도구

요약:  UNIX® 도구 분야는 끊임없이 변해왔습니다. 이 기사에서는 10가지 도구를 살펴보게 되며 이 중에는 그 동안 간과되었던 도구나 새롭게 다루게 될 도구가 포함되어 있습니다.


전문 용어와 마찬가지로 UNIX 도구 분야는 변화를 거듭하고 있다. 새로운 도구가 갑자기 생겨나곤 하지만 어떤 도구는 영구히 현대화되고 새로운 사례에 맞게 개조되기도 한다. 어떤 도구는 일반적으로 사용되지만 어쩌다 사용되는 도구도 있다. 어떤 도구는 계속 혹은 가끔 사용되기도 하지만 완전히 쓸모 없는 도구도 있다. UNIX를 제대로 다루려면 "lingo"를 알아야 한다.

표 1에는 Speaking UNIX 시리즈에서 이전에 검토한 중요한 패키지 11개가 표시되어 있다.


표 1. 우수한 UNIX 도구
이름목적
CygwinWindows® 운영 체제에서 사용할 수 있는 UNIX 계열 쉘과 빌드 환경
fish명령 이름과 옵션, 파일 이름을 자동으로 확장할 수 있고 구문에 색을 입힐 수 있는 대화식 쉘
locate모든 파일로 구성된 데이터베이스를 빌드하고 검색
rename대규모로 수집된 파일의 이름을 한꺼번에 변경
rsync파일과 디렉토리를 로컬과 원격에서 효과적으로 동기화
Screen가상의 지속적 콘솔을 작성하고 관리
Squirrel크로스 플랫폼 스크립팅 쉘
tac입력을 역순으로 즉, 마지막 라인을 먼저 출력(tac cat의 역순으로 출력한다.)
type명령어가 축약어인지, 실행 가능한지, 내장 쉘 또는 스크립트인지 여부를 표시
wget명령행을 사용하여 파일을 다운로드
zsh자동 완성, 고급 리다이렉션 피연산자 및 고급 대체 기능이 있는 고급 쉘

이번 달에는 이미 익숙한 기존 패키지의 기능을 개선하거나 확장할 수 있는 유틸리티와 애플리케이션을 10개 더 살펴보자. 이 유틸리티와 애플리케이션은 범용 아카이브 변환기에서 고속 웹 서버에 이르기까지 다양한 범위에서 실행된다.

어떤 경우에는 UNIX 환경에 따라 새로운 소프트웨어 패키지를 설치해야 한다. 지시에 따라 소스에서 빌드할 수 있으며 패키지 관리 소프트웨어에서 동일한 바이너리 파일을 제공하는 경우 이 파일을 사용하여 시간과 노력을 절약할 수 있다. 예를 들어 Debian Linux®를 사용할 경우 이번 달에 설명한 대부분의 유틸리티를 apt-get을 사용하여 직접 설치할 수 있다.

apropos를 사용하여 명령 찾기

UNIX에는 수 많은 명령이 있으며 그로 인해 특히 가끔 사용하는 유틸리티의 경우에는 그 이름을 잊어버리기 쉽다. 유틸리티 이름이 생각나지 않는 경우 apropos(man -k)를 실행한다. 예를 들어 계산기를 찾고 있는 경우에는 다음과 같이 간단히 apropos calculator라고 입력한다.

$ apropos calculator
bc (1)        - An arbitrary precision calculator language
dc (1)        - An arbitrary precision calculator

bc dc는 명령행 계산기이다.

각 UNIX 매뉴얼 페이지에는 간단한 설명이 있으며 apropos는 특정 키워드 인스턴스에 대한 설명으로 구성된 코퍼스를 검색한다. 이 키워드는 calculator와 같은 문자나 calc*와 같은 정규식이다. 정규식을 사용할 경우 표현식을 인용 부호("")로 둘러싸서 특수 문자가 해석되지 않도록 해야 한다.

$ apropos "calcu*"
allcm (1)     - force the most important Computer-Modern-fonts to be calculated
allec (1)     - force the most important Computer-Modern-fonts to be calculated
allneeded (1) - force the calculation of all fonts now needed
bc (1)        - An arbitrary precision calculator language
dc (1)        - An arbitrary precision calculator

명령행에서의 계산 실행

위에서와 마찬가지로 dc는 모든 UNIX 시스템에 있는 유용한 계산기이다. 인수를 사용하지 않고 dc를 실행하면 다음과 같이 대화식 모드에서 RPN(Reverse Polish Notation) 표현식을 작성하고 평가할 수 있다.

$ dc
5
6 
* 
10
/ 
p
3

그러나 명령행에서 가능한 모든 작업을 수행할 수 있다. -e 옵션을 지정하면 표현식을 평가한다. 또한 표현식을 인용 부호로 둘러싸면 쉘에서 보간되는 것을 방지할 수 있다.

$ dc -e "5 6 * 10 /"
3

pgrep을 사용하여 프로세스 찾기

프로세스를 찾기 위해 ps aux | grep ...을 자주 사용했을 것이다. 아마도 매우 자주. 물론 그렇게 해도 되지만 프로세스를 훨씬 더 효과적으로 찾을 수 있는 방법이 있다. pgrep을 사용해 보자.

예제에서와 같이 이 명령은 strike의 인스턴스화된 모든 로그인 쉘을 찾아 준다. (strike는 사용자 이름임)

$ pgrep -l -u strike zsh 
10331 zsh
10966 zsh

pgrep 명령에는 사용자 이름(-u로 표시됨), 프로세스 그룹 및 그룹 등으로 프로세스를 필터할 수 있는 옵션이 있다. 컴패니언 유틸리티인 pkill pgrep의 모든 옵션을 해석하고 신호를 받아서 이 신호를 해당 기준과 일치하는 모든 프로세스에 보낸다.

즉, pkill -9 -u strike zsh를 실행하면 pgrep -u strike zsh | xargs kill -9를 실행한 것과 결과가 같다.

pwgen을 사용한 보안 암호 생성

사실상 UNIX의 중요한 모든 서브시스템에는 자체적으로 암호가 필요하다. 즉, 이메일, 원격 로그인, 수퍼 사용자 특권에는 모두 암호가 필요하다. —이러한 암호는 서로 달라야 하며 자동화된 공격을 사용하여 추측하거나 추론하기 어려워야 한다. 더욱이 계정을 생성할 수 있는 스크립트를 개발할 경우 신뢰할 수 있는 난수 발생기와 보안 암호가 필요하다.

pwgen 유틸리티는 많은 암호를 생성할 수 있는 작은 유틸리티이다. 암호를 기억하기 쉽거나 안전하게 조정할 수 있으며 숫자, 기호, 모음 그리고 대문자를 포함하도록 지정할 수도 있다.

다수의 UNIX 시스템에는 pwgen이 있다. 없다면 다음과 같이 간단히 빌드하면 된다.

$ # As of March 2009, the latest version is 2.06
$ wget http://voxel.dl.sourceforge.net/sourceforge/\
  pwgen/pwgen-2.06.tar.gz
$ tar xzf pwgen-2.06.tar.gz
$ cd pwgen-2.06
$ ./configure && make && sudo make install

다음은 몇 가지 사용례이다.

  • Print a collection of easy-to-recall passwords:
    $ pwgen -C
    ue2Ahnga Soom0Lu0 Hie8aiph gei9mooD eiXeex7N 
    Wid4Ueng taShee3v Ja3shii8 iNg0viSh iegh5ouF 
    ...
    zoo8Ahzu Iefev0ch MoVu4Pae goh1Ak6m EiJup5ei 
    

  • 다음과 같이 하나의 보안 암호를 생성할 수 있다.
    $ pwgen -s -1
    oYvy9WWa
    

  • 모호하지는 않지만 혼동하기 쉬운 문자와 하나 이상의 비알파벳 문자로 된 하나의 보안 암호을 다음과 같이 생성할 수 있다.
    $ ./pwgen -s -B -1 -y
    7gEqT_V[
    

사용할 수 있는 모든 변수를 확인하려면 pwgen --help를 입력한다.

multitail을 사용한 다수의 파일 감시

새 코드를 디버깅하는 개발자이건, 시스템을 모니터링하는 관리자이건 관계없이 한 번에 많은 일을 주시해야할 경우가 있다. 개발자인 경우 디버그 로그와 stdout을 관찰하여 버그를 추적할 수도 있으며 관리자인 경우 필요에 따라 정책 활동을 조정할 수도 있다. 일반적으로 이러한 두 작업을 하기 위해서는 모니터 화면에 여러 개의 창을 바둑판식으로 깔아 놓고 다양한 상황을 동시에 지켜보아야 한다.

한 번에 몇 개의 파일을 모니터해야 하는 경우 multitail이 유용하다. 이름에서 알 수 있듯이 이 유틸리티는 콘솔 창을 여러 개의 섹션(로그 파일 당 하나의 섹션)으로 나눈다. 더욱이 multitail은 익숙한 형식으로 색상을 지정할 수 있으며(색상 스킴을 사용자 정의할 수 있음), 다수의 파일을 하나의 스트림에 병합할 수 있다.

multitail을 빌드하려면 소스를 다운로드하여 압축을 푼후 make를 실행한다. (해당 배포판에 있는 일반적인 makefile의 옵션은 대부분의 UNIX 시스템에서 지원된다. make에 실패하는 경우 해당 시스템에 지정된 makefile의 최상위 디렉토리를 조사한다.)

# As this article was written, the latest version of multitail was 5.2.2
$ wget http://www.vanheusden.com/multitail/multitail-5.2.2.tgz
$ tar xzf multitail-5.2.2.tgz
$ cd multitail-5.2.2
$ make
$ sudo make install

다음은 multitail에 대한 몇 가지 사용례이다.

  • 같은 창에서 로그 파일 목록을 보려면 다음과 같이 파일 이름 목록을 사용하여 이 유틸리티를 실행한다. multitail /var/log/apache2/{access,error}.log.
  • 같은 창에서 파일 쌍을 보고 읽은 모든 파일을 버퍼에 저장하려면 다음과 같이 -I 옵션을 사용하여 명명된 파일을 다른 파일에 병합한다. multitail -M 0 /var/log/apache/access.log -I /var/log/apache/error.log. 여기서 Apache 오류 로그와 액세스 로그가 새롭게 삽입된다. -M 0는 모든 수신 데이터를 기록하며 B 키를 눌러서 언제든지 버퍼를 확인할 수 있다.
  • 또한 명령과 파일을 섞어서 조화롭게 사용할 수 있다. 로그 파일을 보고 ping의 출력을 모니터하려면 multitail logfile -l "ping 192.168.1.3"을 실행한다. 이 명령을 실행하면 같은 콘솔에 다음과 같이 두 개의 뷰가 생성된다. 한 뷰에는logfile의 내용이 표시되며 다른 하나에는 진행 중인 ping 192.168.1.3의 출력이 표시된다.

명령행 옵션 이외에도 multitail에는 화면의 현재 상태에 영향을 줄 수 있는 대화식 명령 모음이 있다. 즉, 새로운 로그 파일을 추가하려면 해당 화면에서 A 키를 누른다. B 키를 누르면 버퍼에 저장된 내용이 표시된다. Q 키를 누르면 multitail이 종료한다. multitail 명령의 완전한 목록은 매뉴얼 페이지를 참고한다.

7zip을 사용한 압축 및 압축 해제

Windows와 UNIX 에만 수십 개의 일반적인 아카이브 형식이 있다. 즉, Windows에서는 .zip과 .cab이 오랫동안 사용되었으며 UNIX에서는 .tar, .cpio 및 .gzip이 사용되었다. 또한 UNIX 계열에서는 .rpm, .deb 및 .dmg를 사용한다. 이 모든 형식은 일반적으로 온라인에서 사용되어 데이터의 전송 효율성을 높이는 데 기여하고 있다.

특정 형식으로 데이터를 저장하거나 압축을 풀려면 몇 가지 특정 유틸리티를 설치하거나 실제로 모든 아카이브를 압축하거나 압축을 풀 수 있는 일종의 범용 변환기인 7zip을 설치한다. 또한 7zip에는 자체 형식이 있으며 다른 스킴보다 높은 압축률과 테라 바이트에 이르는 대용량 그리고 강력한 데이터 암호화 기능이 있다.

7zip을 빌드하려면 SourceForge 프로젝트 페이지에서 7zip을 UNIX로 포팅한 소스를 다운로드한다. (참고자료를 확인한다.) 해당 tar 파일의 압축을 풀고 소스 디렉토리를 변경한 후 make를 실행한다. (multitail과 마찬가지로 일반적인 makefile이 지원되어야 한다. 그렇지 않은 경우 제공된 특정 makefile 중에서 선택한다.)

$ wget http://voxel.dl.sourceforge.net/sourceforge/p7zip/\   
  p7zip_4.65_src_all.tar.bz2
$ tar xjf p7zip_4.65_src_all.tar.bz2
$ cd p7zip_4.65
$ make
$ sudo make install

빌드가 완료되면 7za가 생성되고 설치된다. 인수를 사용하지 말고 7za를 입력하여 사용할 수 있는 명령과 옵션 목록을 확인한다. 각 명령은 a x 같은 문자이며 각각 아카이브에 파일을 추가할 경우와 아카이브에서 파일을 추출할 경우에 사용되며 사용법이 tar와 흡사하다.

유틸리티를 사용해 보려면 p7zip 소스의 아카이브를 다양한 형식으로 작성한 후 7za를 사용하여 각 아카이브의 압축을 푼다.

$ zip -r p7.zip p7zip_4.65
$ 7za -ozip x p7.zip
$ tar cvf p7.tar p7zip_4.65
$ 7za -otar x p7.tar 
$ bzip2 p7.tar
$ 7za -so x p7.tar.bz2 | tar tf -

7za는 .zip, .tar 및 .bz2 아카이브를 하향식으로 압축을 푼다. 마지막 명령에서 7za는 .bz2 아카이브의 압축을 풀고 그 출력을 stdout에 썼으며 이 과정에서 tar는 해당 파일의 압축을 풀어서 그 목록을 나열했다. tar와 마찬가지로 7za은 파이프(|)의 소스나 대상이 될 수 있어서 다른 유틸리티와 쉽게 결합될 수 있다.

zcat를 사용한 압축 파일 보기

디스크당 용량이 현재 테라 바이트를 넘어섰지만 디스크는 여전히 대용량 파일과 긴 로그 파일, 이미지, 동영상 파일로 빠르게 채워지고 있다. 공간을 절약하려면 많은 파일을 원래의 크기보다 작게 압축해야 한다. 예를 들어 단순한 텍스트로 된 Apache 로그 파일은 원래 크기의 10%로 줄일 수 있다.

압축을 하면 디스크 공간이 줄어들지만 추가 작업이 필요하다. 압축된 Apache 로그 파일을 분석해야 한다면 압축을 풀고 데이터를 처리한 후 다시 압축해야 한다. 경향을 확인하기 위해 기록을 보존해야 할 로그 파일이 대단히 많은 경우 오버헤드가 과다해질 수 있다.

다행히도 gzip에는 압축을 풀지 않은 채로 파일을 처리할 수 있는 다양한 유틸리티가 포함되어 있다. 그 중에서 특히 zcat, zgrep,zless  zdiff cat, grep, less  diff와 각각 사용 목적은 동일하지만 압축 파일을 다룬다는 점이 다르다.

여기서는 gzip을 사용하여 두 개의 소스 파일을 압축하였으며 zdiff를 사용하여 비교하였다.

$ cat old
This
is 
Monday.
$ cat new
This
is 
Tuesday.
$ gzip old new
$ zdiff -c old.gz new.gz
*** -	2009-03-30 22:26:34.518217647 +0000
--- /tmp/new.10874	2009-03-30 22:26:34.000000000 +0000
***************
*** 1,3 ****
  This
  is 
! Monday.
--- 1,3 ----
  This
  is 
! Tuesday.

cURL을 사용하여 웹을 항해하고 인터넷을 정복하여 평화로운 세상을 만들자.

Speaking UNIX Part 3에서는 명령행에서 파일을 직접 다운로드하려면 wget을 사용할 것을 권장했다. 이상적인 쉡 스크립트인 wget은 웹 브라우저를 사용할 수 없는 경우에 매우 유용하다. 예를 들어 원격 서버에 새 소프트웨어를 설치할 경우 wget은 매우 유용한 도구가 될 수 있다.

wget을 애용한다면 cURL 또한 애용하게 될 것이다. wget과 마찬가지로 cURL은 파일을 다운로드할 수 있지만 또한 cURL은 웹 페이지 형태로 데이터를 게시하고 FTP(File Transfer Protocol) 를 통해 파일을 업로드하거나 프록시 역할을 하며 HTTP(Hypertext Transfer Protocol) 헤더를 설정하는 등 많은 작업을 할 수 있다. 여러 가지 면에서 cURL은 명령행에서 웹 브라우저와 기타 클라이언트 대신에 사용할 수 있는 명령이다. 따라서 cURL은 잠재력이 풍부한 애플리케이션이다.

cURL은 유효성이 증명된 ./configure && make && sudo make install 프로세스를 사용하여 즉시 빌드할 수 있다. 다음과 같이 파일을 다운로드하여 압축을 푼 후 해당 명령을 실행한다.

$ wget http://curl.haxx.se/download/curl-7.19.4.tar.gz
$ tar xzf curl-7.19.4.tar.gz
$ cd curl-7.19.4
$ ./configure && make && sudo make install

cURL에는 다양한 옵션이 있으며 이를 확인하려면 매뉴얼 페이지를 자세히 읽어야 한다. 여기에서는 일반적인 몇 개의 cURL 사용례를 살펴본다.

  • cURL tar 파일을 다운로드하려면 다음과 같이 한다.
    $ curl -o curl.tgz http://curl.haxx.se/download/curl-7.19.4.tar.gz
    

    wget과 달리 cURL은 다운로드하는 대상을 stdout에 출력한다. -o 옵션을 사용하여 다운로드한 파일을 명명된 파일에 저장한다.

  • 다수의 파일을 다운로드할 경우 순서나 세트를 모두 지정하거나 하나만 지정할 수 있다. 순서는 대괄호([]) 안에 숫자로 표시하며 세트는 중괄호 안에 목록을 쉼표로 분리하여 표시한다. 예를 들면 다음 명령은 archive1996/vol1에서 archive1999/vol4 디렉토리까지 이름이 parta.html, partb.html  partc.html인 모든 파일 총 48개를 다운로드한다.
    $ curl http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html \
      -o "archive#1_vol#2_part#3.html"
    

    순서나 세트를 지정하면 템플리트와 함께 -o 옵션을 사용할 수 있으며 여기서 #1는 첫 번째 순서나 세트의 현재 값으로 대체되며 #2는 두 번째 순서나 세트의 플레이스 홀더 등이다. 또한 -O 옵션을 사용하여 각 파일의 이름을 그대로 유지할 수도 있다.

  • 서버에 이미지 그룹을 업로드하려면 다음과 같이 -T 옵션을 사용한다.
    $ curl -T "img[1-1000].png" ftp://ftp.example.com/upload/
    

    여기서 img[1-1000].png 글로브는 쉘에서 해당 패턴을 해석하지 않도록 인용 부호로 둘러싼다. 이 명령은 img1.png에서 img1000.png까지 모든 이미지를 서버의 해당 경로에 업로드한다.

  • 심지어 다음과 같이 cURL을 사용하여 디렉토리에서 단어를 찾을 수도 있다.
     $ curl dict://dict.org/d:stalwart
    220 miranda.org dictd 1.9.15/rf on Linux 2.6.26-bpo.1-686
        <auth.mime> <400549.18119.1238445667@miranda.org>
    250 ok
    150 1 definitions retrieved
    151 "Stalwart" gcide "The Collaborative International Dictionary of English v.0.48"
    Stalwart \Stal"wart\ (st[o^]l"w[~e]rt or st[add]l"-; 277),
    Stalworth \Stal"worth\ (-w[~e]rth), a. [OE. stalworth, AS.
       staelwyr[eth] serviceable, probably originally, good at
       stealing, or worth stealing or taking, and afterwards
       extended to other causes of estimation. See {Steal}, v. t.,
       {Worth}, a.]
       Brave; bold; strong; redoubted; daring; vehement; violent. "A
       stalwart tiller of the soil." --Prof. Wilson.
       [1913 Webster]
    
             Fair man he was and wise, stalworth and bold. --R. of
                                                      Brunne.
       [1913 Webster]
    
       Note: Stalworth is now disused, or but little used, stalwart
             having taken its place.
             [1913 Webster]
    .
    250 ok [d/m/c = 1/0/20; 0.000r 0.000u 0.000s]
    221 bye [d/m/c = 0/0/0; 0.000r 0.000u 0.000s]
    

    stalwart를 정의하고자 하는 단어로 교체한다.

명령행 특성 이외에도 cURL의 모든 기능은 libcurl 라이브러리에서 사용할 수 있다. 다수의 프로그래밍 언어에는 FTP를 통한 파일 전송과 같은 작업을 자동화하기 위한 libcurl 인터페이스가 포함되어 있다. 예를 들면 다음 PHP 스크립트에서는 libcurl을 사용하여 양식을 통해 업로드된 파일을 FTP 서버에 저장한다.

<?php
  ...
  $ch = curl_init();
  $localfile = $_FILES['upload']['tmp_name'];
  $fp = fopen($localfile, 'r');
  curl_setopt($ch, CURLOPT_URL, 
      'ftp://ftp_login:password@ftp.domain.com/'.$_FILES['upload']['name']);
  curl_setopt($ch, CURLOPT_UPLOAD, 1);
  curl_setopt($ch, CURLOPT_INFILE, $fp);
  curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
  curl_exec ($ch);
  $error_no = curl_errno($ch);
  curl_close ($ch);
  ...
?>

웹 액세스와 같은 기능을 자동화해야 하는 경우 cURL이 유용한 도구가 될 수 있다.

SQLite: 범용 데이터베이스

UNIX에서는 다수의 데이터베이스가 있으며 이 중 대부분은 오픈 소스이고 일부는 일반 애플리케이션용이며 일부는 매우 전문적인 용도로 사용된다. 일반적으로 데이터베이스는 규모가 크고 독립적인 애플리케이션이지만(MySQL은 별도로 설치하고 구성해야 하며 자체 데몬을 사용함) 이러한 대규모 소프트웨어가 그다지 필요하지 않을 수도 있다. 데스크탑용 주소록 액세서리의 경우에 이름과 전화번호를 유지하기 위해 MySQL을 사용하는 것이 합당할까?아마도 그렇지 않을 것이다.

그리고 애플리케이션을 매우 작은 장치나 규모가 작은 컴퓨터에서 실행하는 경우는 어떤가? 그러한 하드웨어는 다중 처리, 대용량 메모리 또는 실제 스토리지에 대한 중요한 요구사항에 적합하지 않을 수 있다. 분명한 것은 임베디드 데이터베이스가 그 대안이 될 수 있다는 점이다. 통상 임베디드 데이터베이스는 라이브러리로 패키지화되며 애플리케이션 코드에 직접 연결된다. 이러한 솔루션을 사용하면 쿼리가 통상 SQL로 표현되지 않는다는 문제를 갖고 있기는 하지만 애플리케이션이 외부 서비스와 분리된다.

SQLite는 데이터베이스의 장점만을 결합하여 규모가 작고 실제로 모든 애플리케이션에 삽입할 수 있으며 일반적인 SQL을 사용하여 데이터를 쿼리할 수 있다. PHP와 Ruby on Rails는 Apple iPhone과 마찬가지로 SQLite를 기본 스토리지 엔진으로 사용한다.

SQLite를 빌드하려면 모든 소스를 하나의 파일로 결합한 소스를 SQLite 다운로드 페이지에서 다운로드한 후 압축을 풀고 실행한다../configure && make && sudo make install.

$ # As of March 2009, the latest version was 3.6.11. 
$ wget http://www.sqlite.org/sqlite-amalgamation-3.6.11.tar.gz
$ tar xzf sqlite-amalgamation-3.6.11.tar.gz
$ cd sqlite-3.6.11
$ ./configure && make 
$ sudo make install

빌드가 완료되면 라이브러리와 관련 API 헤더 파일 그리고 검색 기능이 탁월한 독립형 명령행 유틸리티인 sqlite3가 생성된다. 데이터베이스를 작성하려면 데이터베이스 이름과 함께 sqlite3를 실행한다. SQL을 명령행에서 바로 입력할 수 있으며 이러한 점은 스크립팅에 매우 유용하다.

$ sqlite3 comics.db "CREATE TABLE issues \
  (issue INT PRIMARY KEY, \
  title TEXT NOT_NULL)" 
$ sqlite3 comics.db "INSERT INTO issues (issue, title) \
  VALUES ('1', 'Amazing Adventures')"
$ sqlite3 comics.db "SELECT * FROM issues"
1|Amazing Adventures

첫 번째 명령을 실행하면 데이터베이스(데이터베이스가 존재하지 않는 경우)가 두 개의 열과 발행 번호, 제목이 있는 테이블과 함께 작성된다. 두 번째 명령을 실행하면 행이 삽입되고 마지막 명령을 실행하면 테이블 내용이 표시된다.

SQLite에는 트리거, 로깅 및 시퀀스 기능이 있다. 또한 SQLite에서는 유형을 지정하지 않는 한 별도의 유형이 없다. 예를 들면 선언된issues 테이블은 유형을 지정하지 않아도 잘 동작한다.

$ sqlite3 comics.db "create table issues (issue primary key, title)"
$ sqlite3 comics.db "INSERT INTO issues (issue, title) \
  VALUES (1, 'Amazing Adventures')"
$ sqlite3 comics.db "SELECT * FROM issues"1|Amazing Adventures

유형이 없다는 것은 일종의 기능이며 버그가 아니며 이로 인해 다양한 애플리케이션을 수용할 수 있다.

바로 사용할 수 있는 웹 스택인 XAMPP 사용하기

UNIX 시스템을 웹 서버로 사용할 경우 웹 스택을 다양한 방식으로 구성할 수 있다. 물론 Apache HTTP Server, MySQL, Perl, PHP, Python 및 Ruby on Rails가 있지만 이 기사에서는 SQLite와 lighttpd 같이 이전에 들어본 적이 없을 수도 있는 몇 가지 구성요소를 권장한다.

그러나 처음부터 스택을 구축하지는 않는다. Apache와 다른 소프트웨어 패키지를 상호 동작하도록 구성하는 과정은 때로는 힘든 일이 될 수 있으며 소스를 직접 유지하며 새로운 패치가 발행될 때마다 재컴파일하는 부담을 지고 싶지 않을 수도 있다. 이러한 경우 언제나 바로 사용할 수 있는 스택을 선택할 수 있다. 다음과 같이 설치하고 진행한다.

XAMPP는 사전에 패키지된 웹 스택 중 하나로 온라인에서 찾을 수 있다. XAMPP에는 MySQL, PHP 및 Perl의 호환 가능한 빌드와 Apache가 포함되어 있다. XAMPP 버전은 Linux, Sun Solaris, Windows 및 Mac OS X에서 사용할 수 있다. 다음과 같이 XAMPP를 다운로드하고 압축을 푼후 실행한다.

# The latest version for Linux was 1.7
$ wget http://www.apachefriends.org/download.php?xampp-linux-1.7.tar.gz
$ sudo tar xzf xampp-linux-1.7.tar.gz -C /opt
$ sudo /opt/lampp/lampp start
Starting XAMPP 1.7...
LAMPP: Starting Apache...
LAMPP: Starting MySQL...
LAMPP started.

두 번째 명령을 실행하면 XAMPP 배포판의 압축이 풀리고 /opt에 바로 저장된다. (해당 명령 앞에 sudo를 사용해야 한다.) XAMPP를 다른 곳에 저장할 경우 인수를 -C로 변경한다. 마지막 명령을 실행하면 웹 사이트를 서비스하기 위해 필요한 두 개의 데몬인 Apache와 MySQL이 실행된다. 설치를 테스트하려면 웹 브라우저의 주소창에 http://localhost를 입력한 후 Enter를 누른다. 그림 1과 같은 화면이 표시되어야 한다.


그림 1. XAMPP 스택 시작 페이지
XAMPP 스택 시작 페이지 

Status를 눌러서 동작 상태를 확인한다. XAMPP는 서버에서 MySQL 데이터베이스를 작성하고 관리하며 각각 웹 트래픽을 측정할 수 있는 phpMyAdmin과 webalizer를 제공한다.

또한 XAMPP는 전체 소스 코드를 해당 스택에 제공하며 따라서 필요한 경우 사용자 정의를 스택에 적용하거나 추가할 수 있다. 결국 프로세스를 직접 다루거나 사용자 정의하고자 할 경우 XAMPP 소스 코드에서 스택을 빌드하는 방법을 확인할 수 있다.

lighttpd 서버를 사용한 소형화

XAMPP와 lighttpd와 같은 다양한 번들에는 Apache HTTP Server가 포함되어 있다. 대부분의 측정 결과를 놓고 볼 때 Apache는 분명히 유용한 애플리케이션이고 여전히 전세계 다수의 웹 사이트에서 Apache를 사용하고 있으며 수 많은 익스텐션을 이용하여 대규모 서브시스템을 추가하거나 프로그래밍 언어와 굳건하게 통합할 수 있다.

그러나 Apache가 사용할 수 있는 유일한 웹 서버는 아니며 어떤 경우에는 적합하지 않을 수도 있다. 복잡한 Apache 인스턴스로 인해 막대한 메모리 용량이 필요하고 이 때문에 처리량이 제약을 받는다. 더욱이 Apache 인스턴스가 작은 경우에도 처리량에 비해 메모리 용량을 많이 필요한다.

Apache에 대한 대안이 될 수 있는 매우 효과적인 도구인 lighttpd("lighty"로 발음함)는 "보안, 속도, 호환 및 유연성"을 두루 갖추고 있다. lighttpd 구성 파일은 Apache 구성파일과 같이 복잡하지 않아서 더욱 좋다.

lighttpd는 다른 라이브러리를 사용하기 때문에 처음부터 lighttpd를 빌드하여도 약간의 추가 작업만 필요할 뿐이다. 최소한 PCRE(Perl Compatible Regular Expression) 라이브러리와 Zlib 압축 라이브러리 개발 버전(헤더 파일을 포함하고 있는 버전)이 필요하다. 라이브러리를 설치하고 나면(그렇지 않으면 처음부터 라이브러리를 설치한다.) lighttpd 컴파일은 순조롭게 진행된다.

$ # Lighttpd requires libpcre3-dev and zlib1g-dev
$ wget http://www.lighttpd.net/download/lighttpd-1.4.22.tar.gz
$ tar xzf lighttpd-1.4.22.tar.gz
$ cd lighttpd-1.4.22
$ ./configure && make && sudo make install

다음에는 구성을 해야 한다. 최소한 문서 루트, 서버 포트, 몇 개의 MIME(Multipurpose Internet Mail Extension) 유형 및 기본 사용자와 데몬의 그룹을 다음과 같이 지정해야 한다.

server.document-root = "/var/www/lighttpd/host1"
server.groupname = "www" 
server.port = 3000
server.username = "www" 

mimetype.assign = (
  ".html" => "text/html", 
  ".txt" => "text/plain",
  ".jpg" => "image/jpeg",
  ".png" => "image/png" 
)

static-file.exclude-extensions = ( ".fcgi", ".php", ".rb", "~", ".inc" )
index-file.names = ( "index.html" )

해당 텍스트를 /opt/etc/lighttpd.conf에 저장했고 lighttpd -D -f /opt/etc/lighttpd.conf를 사용하여 lighttpd를 시작했다고 가정한다.

Apache와 마찬가지로 lighttpd도 가상 호스트를 지원할 수 있다. 조건에 따라 세 라인을 수정하기만 하면 된다.

$HTTP["host"] == "www2.example.org" {
  server.document-root = "/var/www/lighttpd/host2
}

여기서 호스트 이름이 www2.example.org인 경우에는 다른 문서 루트가 사용된다.

특히 Lighttpd를 사용하면 다량의 병렬 요청을 능숙하게 관리할 수 있다. lighttpd를 Rails, PHP 등과 함께 사용할 수도 있다.

더 능숙하고 더 현명하고 더 빠르게

또 다른 "Speaking UNIX"가 거의 끝나간다. 키보드를 준비하고 Wi-Fi를 켜고 다운로드를 시작하라!


참고자료

교육

  • Speaking UNIX: 이 시리즈의 다른 다른 부분을 살펴볼 수 있다. 

  • UNIX shells: UNIX 쉘에 관해 더 자세히 학습할 수 있다. 

  • AIX and UNIX: developerWorks AIX 및 UNIX 영역에서는 AIX 시스템 관리와 관련된 그리고 UNIX 능력을 확대할 수 있는 다양한 정보를 볼 수 있다. 

  • New to AIX and UNIX: AIX와 UNIX에 대한 자세한 정보를 볼 수 있다. 

  • 기술 서점: 다양한 기술 주제와 관련된 서적을 살펴볼 수 있다. 

제품 및 기술 얻기

  • pwgen: pwgen 소스 코드를 다운로드할 수 있다. 

  • multitail: multitail 소스 코드를 다운로드할 수 있다. 

  • p7zip: p7zip 소스 코드를 다운로드할 수 있다. 

  • cURL: cURL 소스 코드를 다운로드할 수 있다. 

  • SQLite: 프로젝트 페이지에서 SQLite 소스 코드를 다운로드할 수 있다. 

  • XAMPP: Apache Friends에서 XAMPP를 다운로드할 수 있다. 

  • Lighttpd: lighttpd 소스 코드를 다운로드할 수 있다. 

토론



출처 - http://www.ibm.com/developerworks/kr/library/au-spunix_greattools/index.html



Posted by linuxism
,