BNU(Basic Networking Utilities): uustat
---------------------------------------------------------------------
1. uustat
uustat uucp 작업상태 조회및 작업의 제어
┌─────────────────────────────────┐
│ uustat [-q] or [-m] or [-kjobid [-n]] or [-rjobid [-n]] or [-p] │
│ uustat [-a [-j]] [-user] [-Sqric] │
│ uustat [ssystem [-j]] [-user] [-Sqric] │
│ uustat -tsystem [-dnumber] [-c] │
└─────────────────────────────────┘
uustat 유틸리티는 다음과 같은 3가지 형태의 작업을 수행한다.
. 이전에 지시된 명령어의 작업상태의 표시 또는 취소
. 평균 전송비 또는 평균적인 큐(queue)에 저장되는 시간에 관한
원격지 시스템 효율성 정보를 제공
. 다른 시스템으로의 전반적인 원격지 시스템 측면과 사용자 측면의
uucp 접속의 상태를 제공
uustat 명령어는 이전의 uucp 명령어들의 상태 또는 취소를 수행하기 위한
다음과 같은 옵션을 제공한다. uustat는 각각의 uustat 명령어 실행시
오직 하나의 옵션만을 지정할 수 있다.
-a 큐(queue)에 있는 모든 작업을 표시한다.
-j 출력되는 작업의 총갯수를 표시한다. -j 옵션은 -a 또는 -s 옵션의
조합에 이용될 수 있다.
-kjobid
작업 식별자가 jobid인 uucp 작업 요구를 삭제한다.
시스템 관리자나 uucp 관리자를 제외하고는 삭제되는 uucp 작업 요구는
uustat 명령어를 수행한 사용자의 소유이어야 한다.
만일 작업이 관리자나 uucp 관리자에 의해 삭제되면, 메일이
작업을 수행한 사용자에게 돌려진다.
-m 모든 시스템들의 억세스 가능 현황을 표시한다.
-n 모든 표준 출력 정보들을 생략한다. 단, 표준 에러 정보는 표시된다.
-n 옵션은 -k와 -r 옵션과 조합되어 사용될 수 있다.
-p Lock 화일내의 모든 프로세스에 대하여 ps -flp명령을 실행한다.
┌─────────────────────────────────┐
│ ps 현재의 프로세스들에 대한 정보를 표시한다. │
│ ┌───────┐ │
│ │ ps [-option] │ │
│ └───────┘ │
│ ( 옵션 ) │
│ -f 프로세스에 관련된 정보중 모든 필드들을 출력한다. │
│ -l 자세한 정보를 출력한다. │
│ -p 지정한 화일내에 들어 있는 프로세스들에 대한 출력만을 │
│ 생성한다. ( 위에서는 Lock 화일이 이에 해당된다.) │
└─────────────────────────────────┘
-q 각 시스템의 큐(queue)에 저장되어 있는 작업들을 출력한다.
시스템에 status file이 존재할 경우에는 작업과 관련된 날짜, 시간,
상태 정보를 출력한다.
-rjobid
지정한 jobid를 다시 활성화 시킨다.
평균 전송비 또는 평균적인 큐(queue)에 저장되는 시간에 관한
원격지 시스템 효율성 정보를 제공하는 아래의 옵션등을 제공한다.
이중 -c 와 -d 옵션은 -t옵션과 조합을통해서만 사용할 수 있다.
-tsystem
원격지 시스템에 대한 지나 60분동안의 평균 전송비 또는 평균
큐(Queue)에 저장된 시간을 출력한다.
-dnumber
number는 분(minute)을 의미한다. 이 옵션은 지정한 시간(즉; 분단위의
시간)동안의 효율성을 검사한다.
-c 이 옵션이 지정될 경우에는 평균 큐(Queue)에 저장되는 시간을 출력한다.
미지정시에는 평균 전송비가 출력된다.
다른 시스템으로의 전반적인 원격지 시스템 측면과 사용자 측면의
uucp 접속 상태를 제공하는 옵션도 제공된다.
-ssytem
원격지 시스템에 대한 모든 uucp 작업 요구의 상태를 출력한다.
-uuser
지정한 user에의해 요구된 모든 uucp 작업 요구의 상태를 출력한다.
-Sqric
작업의 상태를 표시한다.
즉; 큐(queue)에 저장된 작업을 위해 q, 실행중인 작업을 위해 r,
가로채기된(interrupted) 작업을 위해 i, 완성된 작업을 위해 c를
지정한다.
uucp 명령어상에 아무 옵션도 지정하지 않을 경우에는 현재 명령어를
실행하고 있는 모든 uucp 작업 요구의 상태를 출력한다.
---------------------------------------------------------------------------
BNU(Basic Networking Utilities): cu
---------------------------------------------------------------------
1. cu(call unix)
cu cu 명령은 사용자가 또다른 시스템으로의 연결, 즉, 로그인하여
원래의 시스템에서 로그인 상태로 다른 시스템의 기능을 사용하게
해 준다. 이 cu 기능으로 local system에 접속된 단말기를 통하여
remote system의 응용 프로그램을 사용할 수 있게 된다.
┌─────────────────┐
│ cu [options] [destination] │
└─────────────────┘
cu는 다른 유닉스 시스템, 터미널, 비 유닉스 시스템을 호출한다.
cu는 화일의 전송에 대하여 대화 형식으로 관리한다.
cu 명령어의 실행은 2 단계로 고려할 수 있다.
첫번째 단계는 접속이 확립되는 접속 단계(Connection Phase)이다.
접속이 수행되면 대화 단계가(Conversation Phase) 시작된다.
-d 옵션은 이들 두 단계에서 지정 가능한 유일한 옵션이다.
-d 프린트 되어질 Diagnostic traces(프로그램 실행을 감시 추적하는
기능)을 수행한다.
접속 단계(Connection phase)
cu는 uucp가 접속을 확립하기 위해 수행하는 것과 동일한 메카니즘을
이용한다. 이것은 uucp 제어 화일인 /etc/uucp/Devices와
/etc/uucp/Systems를 이용한다는 것을 의미한다. 이러한 특성은
접속을 확립하기 위해 여러개의 다른 매체(media)중에 선택할 수
있는 능력을 cu에게 부여한다. 여기서 매체(media)라 함은 전화라인
(Telephone line), 직접접속(Direct connection), LAN(Local Area
Network)을 의미한다. Device 화일이 시스템에서 사용 가능한 매체의
목록을 가지고 있다. Systems 화일은 일반적으로 읽기 불가능한 형태로
원격지 시스템으로 접속하기 위한 정보를 갖고 있다.
cu 명령어 라인상의 destination 파라메터는 cu에게 접속할 시스템이
무엇인가를 알려주기위해 사용된다. destination은 미지정 또는
전화 번호, 시스템 명, 그리고 LAN 어드레스를 지정할 수 있다.
전화 번호는 다이얼 문자 (0에서 9까지의 숫자, * 와 #)들과 특수문자인
=과 -로 구성된 문자열이다. = 표시는 보조적인 다이얼 문자이고,
- 문자는 4초간의 지연을 의미한다.
시스템 명은 uucp가 호출할 수 있는 컴퓨터의 이름이다.
uuname 명령어는 시스템 명들의 목록을 프린트 한다.
LAN 어드레스는 시스템에 구축된 LAN 문서를 통해 확인할 수 있다.
이후 설명할 -c 또는 -l 옵션이 사용되지 않은 경우, cu는 사용해야 할
매체를 결정하기 위해 destination을 사용하게 된다.
만일 destination이 전화번호이면, cu는 전화라인 매체를 이용하려는
것으로 가정하고, ACU(Automatic Call Unit)을 선택한다.
만일 destination이 전화번호가 아니면 cu는 시스템 명으로 가정한다.
cu는 uucp 호출 메카니즘을 따르게되고, 최선의 유용한 접속을 얻기 위해
Systems 과 Devices 화일을 사용한다. cu가 선택된 매체에 상응하는
전송속도를 선택한 이후에는, destination이 시스템 명일 경우에
-s 옵션을 사용할 수 없다.
-c와 -l 옵션은 이러한 디폴트 작업 처리 형태를 수정할 수 있다.
-c 옵션은 Device 화일의 Type 필드를 지정함으로써 LAN을 선택하기
위해서 아주 빈번히 사용된다. 이 때에 destination은 system name인 것으로
가정된다. system name으로의 접속이 실패하면, LAN 어드레스처럼
destination을 이용하여 접속이 시도되어 진다. -l 옵션은 직접 접속
(Direct connection)과 관련된 장치를 지정하기 위하여 사용된다.
만일 접속이 원격지 시스템으로 정확한 직접접속이면, 그때는 destination을
지정할 필요가 없다. 이 것이 destination을 지정하지 않아도 되는 유일한
경우이다. 다른 한편으로는 지정한 장치가 다이얼러(dialer)로 접속되는
경우가 있을 수 있다. 그래서 destination으로써 전화번호를 지정하는 것이
적당하다. -c 와 -l 옵션은 동일 명령어 라인상에 지정할 수 없다.
cu 명령어는 많은 옵션을 갖고 있다. -c, -l, -s 옵션은 매체를 선택하는
부분에서 사용되며, 나머지 옵션은 통신 라인을 구성하는데에 사용된다.
-sspeed 300, 1200, 2400, 4800, 9600과 같은 전송속도를 지정하는
옵션이다. 미지정시에 가정되는 전송속도는 /etc/uucp/Devices
화일의 라인 종류에 따른 값이 적용된다. 대부분의 모뎀은
300, 1200, 2400이며, 직접 접속 라인은 2400 이상으로 설정될
수 있다.
-ctype Device 화일의 첫번째 필드는 Type 필드이다. -c 옵션은
cu 명령어에게 사용자가 지정한 type과 일치하는 Type 필드내의
엔트리만을 이용하도록 한다. 사용자가 지정하는 type은
통상 LAN의 이름이다.
-lline 통신 라인으로써 사용하는 장치명을 지정한다.
-bn n을 라인상에서 처리되는 비트(bit)의 수로 지정한다.
-e Even(짝수) 페리티를 설정한다.
-h 통신 모드를 half-duplex로 설정한다.
-n 전화번호에 대한 사용자프롬프트를 요구한다.
-o Odd(홀수) 페리티를 설정한다.
-t 자동 응답으로 설정되어 있는 터미널을 조정하기 위해 사용한다.
대화 단계(Coversation Pharse)
접속을 수행한 이후, cu 유틸리티는 두가지 처리를 수행한다.
전송 처리는 표준 입력으로 부터(키보드) 데이타를 읽고, 단, ~로 시작하는
라인은 제외한다., 원격지 시스템에 데이타를 전달한다. 수신 처리는
원격지 시스템으로 부터 데이타를 받아들이고, 단, ~로 시작하는 라인은
제외된다., 표준 출력 장치에 데이타를 전달한다. 일반적으로
DC3/DC1 프로토콜이 버퍼가 초과하지 않도록 하기위해, 원격지 시스템으로
부터 입력을 제어하기 위해 사용된다. ~로 시작하는 라인은 특수한 의미를
갖고 있다.
전송 처리는 다음과 같은 사용자가 지정한 명령어들을 해독한다.
~. 대화식 처리를 종료한다.
~! 쉘 명령어들을 수행하기 위해 Local System상의 쉘로 일시적으로
빠져 나간다.
~!cmd
Local System에서 지정한 cmd를 실행한다.
~$cmd
Local System에서 cmd를 실행하고, 원격지 시스템에 그 출력을
보낸다.
~cd
Local System상에 디렉토리를 변경한다.
~take from [to]
Remote System상의 화일을 Local System상의 화일로 복사한다.
~put from [to]
Local System상의 화일을 Remote System상의 화일로 복사한다.
~~line
~line을 Remote System에 전달한다.
~%break
Remote System에 BREAK를 전송한다.
~debug
디버깅 옵션을 on 또는 off한다.
~t
사용자 단말에 대한 termio 구조 변수들의 값을 프린트 한다.
~l
원격 통신 라인에 대한 termio 구조 변수의 값을 프린트 한다.
~ifc
DC3/DC1 입력 제어 프로토콜과 입력 제어 미수행사이를 서로 바꾸어
적용한다.
~ofc
출력 제어 설정을 가능 또는 불가능하게 한다.
~divert
자발적 전환(unsolicited diversions)을 허용 또는 허용하지 않는다.
~old
수신되는 전환에 대해서 구버전의 문법을 허용 또는 허용하지 않는다.
cu 명령어가 시스템 X에서 시스템 Y로 접속하기 위해 사용되고,
연이어 시스템 Y에서 시스템 Z로 접속하려고 사용될때, 시스템 Y에서
~~를 사용하여 명령어를 실행할 수 있다.
다음은 접속되는 시스템상에서의 uname 명령어의 실행을 보여주고 있다.
uname
Z <--- uname 명령의 실행 결과
~[X] !uname
X <--- uname 명령의 실행 결과
~~[Y] !uname
Y <--- uname 명령의 실행 결과
예를들어 cu 명령어의 실행을 확인해 보자.
┌───────────────┐
│ cu -s1200 9=12015551234 │
└───────────────┘
위의 예는 1200의 전송속도로 9 1 201 555 1234라는 전화라인으로
시스템을 접속하려고 하는 예이다.
┌────────────┐
│ cu -c DK address │
└────────────┘
위의 예는 DK라는 LAN 네트웍상의 address로 지정되는 시스템으로의
로그인을 수행하는 예이다.
┌─────────────┐
│ cu -l /dev/term/XX │
│ cu -l term/XX │
└─────────────┘
직접 접속 라인을 통해 특정 시스템으로 로그인을 수행하려는 예이다.
( Direct Connect Line )
┌──────────────┐
│ cu -s1200 -l term/XX │
└──────────────┘
지정한 전송 속도를 갖고, 특정 시스템에 로그인 하려는 예이다.
┌─────────────────┐
│ cu -l culXX 9=12015551234 │
└─────────────────┘
Auto dialer를 통해 특정 라인을 사용하여 시스템을 호출하는 예이다.
┌──────────┐
│ cu systemname │
└──────────┘
시스템 이름을 사용하여 접속하는 예이다.
---------------------------------------------------------------------------
BNU(Basic Networking Utilities): uux, uuxqt
---------------------------------------------------------------------
1. uux ( Unix to Unix system command execution )
이 명령은 Remote System상에서 특정 명령어의 실행을 허용한다.
┌─────────────────┐
│ uux [option] command-string │
└─────────────────┘
uux는 개개의 시스템으로부터 여러 화일들을 모으고, 특정의 시스템에서
명령어를 실행하고, 표준 출력을 화일로 보낸다.
(주의) 보안 유지 측면에서, uux로부터 받아들인 요구들을 대해서,
대부분의 시스템은 실행 가능한 명령어들을 제한한다.
( 원격 실행시의 접근 권한은 /etc/uucp/Permmissions에 정의되어
있다. )
명령어 문자열은 명령어와 화일명이 system-name!이 선행되는 점을
제외하고는, 명령어 라인과 유사한 하나 또는 그이상의 인자(Arguments)로
구성된다. Null 시스템 명은 Local system으로 간주된다.
화일명은 다음과 같은 형식으로 지정할 수 있다.
1) 절대 경로명
2) ~xxx가 선행하는 경로명
xxx는 시스템에 등록된 로그인 명이며, 실행시 해당 사용자의
홈 디렉토리로 대치된다.
3) 아무것도 지정하지 않으면 현재의 작업 디렉토리가 적용된다.
예를들면 다음과 같다.
uux "!diff sys1!/home/dan/file1 sys2!/a4/dan/file2 >
!~/dan/file.diff"
이 예는 sys1과 sys2라는 시스템의 file1과 file2를 diff 명령어를 통해
병합한후 그 결과를 Local system상의 PUBDIR디렉토리 밑의 dan 디렉토리내에
file.diff라는 화일에 저장하는 명령어 라인을 보여주고 있다.
여기서 PUBDIR이라는 디렉토리는 uucp 펙키지에 정의된 공공 디렉토리이며,
통상 /var/spool/uucppublic 디렉토리이다.
<,>,;,|와 같은 쉘 특수문자를 명령어상에 지정하기위해서는 사전에 quoting
되어야 한다.
uux "a!cut -f1 b!/usr/file > c!/usr/file"
위의 예는 시스템 b로부터 /usr/file 화일을 받아서, 시스템 a에 보낸다.
그리고 받은 화일에 대해 a 시스템상에서 cut 명령어를 실행하고, 그 결과를
c 시스템의 /usr/file에 저장한다.
uux는 요구한 명령어의 실행이 Remote system상에서 허용되지 않으면 통보해
준다. 이러한 통지 기능은 -n 옵션에 의해 막을수 있다. 이 경우 응답은
Remote system으로 부터 메일로 보내진다.
uux에서 사용되는 옵션은 온라인 참조 메뉴얼을 참조 바란다.
2. uuxqt
┌─────────────────┐
│ /usr/lib/uucp/uuxqt [option] │
└─────────────────┘
uuxqt는 uux 명령어를 사용함에 의해 생성된 Remote system으로 부터의
원격 작업 처리 요구를 실행하는 프로그램이다.uuxqt 프로그램은
실행 요구를 찾기 위해 스풀 디렉토리(Spool Directory)를 검색한다.
각각의 요구에 대해, uuxqt는 요구된 데이타 화일의 가용성, 억세스 가능 여부,
요구된 명령이 요구 시스템에서 요구 가능한지를 검사한다. Permissions
화일은 해당 화일의 억세스 가능 여부및 명령어 실행 접근 권한을 검증하기
위해 사용된다.
uuxqt 명령어를 실행되기 전에 설정되는 두가지 환경 변수가 있다.
- UU_MACHINE은 작업을 보낸 시스템 명이 설정된다.
- UU_USER는 작업을 보낸 사용자 명이 설정된다.
이러한 변수들은 실행되는 요구에 대한 정보및 통계 정보및 제한을 가하는
프로그램을 작성하는데 사용되어질 수 있다. uuxqt명령어는
다음과 같은 옵션을 갖는다.
-ssystem Remote system 명을 지정한다.
-xdebug_level
명령어 실행 검증 레벨을 0부터 9까지의 숫자로 지정한다.
9가 가장 높은 레벨이며, 자세한 검증 정보들이 표시된다.
---------------------------------------------------------------------------
입출력 방향전환의 일반 개요
명령어 입출력 방향전환(Command Input/Output Redirection)
---------------------------------------------------------------------
1. 표준 입력, 표준 출력, 표준 에러
대부분의 명령어들은 표준 입력(Standard input)이라 불리우는
정보원(Source)으로부터 입력을 받는다. 다른방식으로 지정한 경우를
제외하고는, 미지정시의 정보원은 터미널 스크린이다.
마찬가지로 명령어는 표준출력(Standard output)이라 불리우는
목적지(destination)에 출력을 보낸다. 명령어상에 목적지를 미지정했을
경우에는 기본적으로 터미널 스크린이 적용된다.
또한 명령어에 의해 생성된 에러 메세지들은, 미지정시 터미널 스크린인,
표준 에러(Standard error)로 보내진다.
유닉스 쉘은 명령어 프로그램의 표준 입력, 표준 출력, 그리고 표준 에러의
정보원과 목적지를 관리한다. 다음은 이를 보여주는 그림이다.
┏━━━━━━┓
┏━┛ ┗━┓
┃ UNIX Shell ┃
┗━┓ ┏━┛
┗━━━━━━┛
▒ 명령어의 입출력 방향을 관리
▒
┌───────┐
│Shell Command │
└───────┘
▲
Standard Output ▒ ▒ Standard Input
Standard Error ▒ ▒
▼
┏━━━━━━━┓
┃ Screen ┃
┗━━━┳━━━┛
━━━━┻━━━━
실질적으로 명령어 프로그램은 표준 입력이 실제로 터미널 키보드로 부터
인지 또는 화일로 부터인지를 알지 못한다. 마찬가지로 명령어 프로그램은
표준 출력이 터미널 스크린으로 가는지, 화일로 가는지, 다른 명령어로
가는지 또는 복수개의 목적지로 가는지를 알지 못한다.
이는 이러한 표준 입출력및 에러의 방향 제어는 쉘이 수행함을 의미한다.
쉘이 명령어 프로그램의 표준 입력, 표준 출력 그리고 표준 에러를
방향 전환 하도록 지시할 수 있다. 이 기능은 유닉스 쉘의 매우 유용한
기능이다.
cat 명령어는 터미널이 어떻게 표준 입력 그리고 표준 출력으로써
사용되는지를 보여준다. cat 명령어는 명령어 라인상에 지정된 화일로
부터 입력을 받아들이고, 화일의 내용을 쉘에 의해 터미널 스크린으로
지정된 표준 출력으로 복사한다. cat 명령어상에 화일명을 지정하지
않으면, cat 명령어는 터미널 키보드인 표준 입력으로 부터 입력을 취한다.
다음은 cat 명령어를 사용하는 예를 보여주고 있다.
┌─────────┐ 이예는 cat 명령어가 인자로써 화일명을
│ $cat │ 지정하지 않았을 경우의 처리하는 형태를 보여
│ _ │ 주고 있다. cat 명령어는 이 경우 키보드로 부터
└─────────┘ 입력을 받아 이를 처리하기 위해, 입력을 기다린다.
┌────────────────┐
│ $cat │ 이예에서는 표준 입력 처리된
│ Entering a line of text. │ cat 명령어가 수행되는 과정을
│ Entering a line of text. │ 보여준다. 똑같은 라인이 두번
│ cat continues to copy text │ 표시되는 것을 볼수 있는데,
│ cat continues to copy text │ 처음의 것은 사용자의 입력이고,
│ until Ctrl-d is pressed │ 두번째의 것은 cat 명령의
│ until Ctrl-d is pressed │ 표준 출력이다.
│ on a line by itself │ cat 명령어의 실행은
│ on a line by itself │ ^d를 누를때까지 계속된다.
│ <^d> │
│ $ │
└────────────────┘
2. 표준 입출력 방향 전환 특수 문자.
방향전환(Redirection) 특수문자들은 쉘이 표준입력의 정보원과 표준출력과
표준에러의 목적지를 변경하는 다양한 방식을 제공한다.
쉘로 하여금 프로그램의 입력, 출력, 또는 에러의 방향을 전환하도록 하기
위해 명령어 라인상에서 사용되는 특수문자들은 다음과 같다.
┌────┬───┬────────────────────────┐
│ 대상 │ 심볼 │ 처리 내용 │
┝━━━━┿━━━┿━━━━━━━━━━━━━━━━━━━━━━━━┥
│ 입력 │ < │ 지정한 화일로부터입력을 받아들인다. │
├────┼───┼────────────────────────┤
│ │ > │ 지정한 화일에 출력을 저장한다. │
│ ├───┼────────────────────────┤
│ 출력 │ >> │ 지정한 화일에 출력을 추가한다. (Append) │
│ ├───┼────────────────────────┤
│ │ | │ 지정한 명령어로 출력을 넘겨준다. │
│ ├───┼────────────────────────┤
│ │ tee │ 여러곳의 목적지로 출력을 보낸다. │
└────┴───┴────────────────────────┘
명령어 라인상에 상기와 같은 특수 문자들이 지정되어 있을 경우에,
쉘은 명령어가 커널에 의해 실행되기 이전에 이 문자들을 번역한다.
1) 입력 방향 전환
< 심볼은 지정한 화일로부터 입력을 프로그램에 전달하도록
쉘에게 지시한다.
2) 출력 방향 전환
출력 방향 전환은 터미널 스크린과 다른 목적지로 명령어의 출력을
전환한다. 명령어 프로그램의 출력은 화일 , 다른 명령어 또는
화일과 다른 명령어 양쪽으로 보낼 수 있다.
> 심볼은 지정한 화일로 프로그램의 출력을 보내도록 쉘에게 지시한다.
>> 심볼은 명령어로부터의 표준 출력을 지정한 화일에 추가하도록 한다.
| 심볼은 둘 또는 그 이상의 명령어를 연결시켜 준다.
이 심볼은 하나의 명령어의 출력을 다음 명령어의 입력으로써 파이프
를 통하듯 그대로 전달해주기 때문에 통상 파이프라 한다.
tee 명령어는 명령어의 출력을 분배하고, 지정한 화일과 파이프상의
다음 명령어와 같은 복수개의 목적지로 출력을 전환한다.
---------------------------------------------------------------------------
입출력의 화일로의 방향전환(Redirection)
명령어 입력 방향전환(Command Input Redirection)
---------------------------------------------------------------------
1. 입력 방향전환(Input Redirection)
입력 방향전환을 사용하는 명령어 라인에 대한 형식은 다음과 같다.
┌─────────────────────────┐
│ command [-option] [arguments] < input_file │
│ < 심볼은 화일로의 출력 방향전환을 나타낸다. 이 심볼은 표준 출력을
제공하는 명령어들과 함께 사용할 수 있다. 출력 방향전환 심볼을 포함하고
있는 명령어 구조는 다음과 같다.
┌───────────────────────────┐
│ command [-option] [arguments] > output_file │
│ >> output_file │
└───────────────────────────┘
다시말하자면 > 심볼 주위의 공백은 꼭 사용해야 되는 것은 아니나,
관습상으로 공백을 사용한다.
다음은 출력 방향전환을 보여주는 예이다.
┌────────────────────────┐
│ $cat > text │
│ Text is not echoed to the screen because │
│ it is redirected to the named file. │
│ <^d> │
│ $cat text │
│ Text is not echoed to the screen because │
│ it is redirected to the named file. │
└────────────────────────┘
이 예는 표준 출력이 text라는 화일로 방향전환 된다. cat 명령어에
입력 화일을 지정하지 않았기 때문에, 쉘은 <^d>를 누를때까지
키보드로부터 입력을 받아 cat 명령어에 전달한다. 이때 사용자가
입력한 텍스트가 출력 방향전환 심볼에의해 text라는 화일에 저장됨으로
인해 화면상에 또한번 표시되지 않음을 주목하기 바란다.
자 그럼 여기에서 한가지 생각해 볼 문제가 있다.
cat 명령어상에 지정한 화일이 기존에 존재하는 화일일 경우에는
어떻게 처리될까? 다음예는 이 의문에 대한 답을 보여준다.
┌───────────────────────┐
│ $cat > text │
│ This text replace the orginal text. │
│ <^d> │
│ $cat text │
│ This text replaces the original text. │
└───────────────────────┘
이전 예에서 text라는 화일에 2 라인의 텍스트가 이미 저장 되었었다.
그런데 동일한 화일을 또다른 cat 명령어상에 지정하였다. 이경우
기존에 존재하는 내용을 덮어 씌우게 된다. (이를 overwrite라 한다. )
Bourne shell은 cat 명령어의 출력에 대한 준비를 하기위해 기존의
화일 내용을 지운후 새로운 저장을 저장하게 된다.
이와 같이 기존에 존재하는 화일 내용의 소실을 방지하기 위해,
>> 심볼을 사용하여 새로운 내용을 기존의 내용의 끝에 추가하도록
지정할 수 있다. 다음 예제는 그 예를 보여주고 있다.
┌─────────────────────┐
│ $cat >> text │
│ Adding more text to the file. │
│ $cat text │
│ This text replaces the original text. │
│ Adding more text to the file. │
└─────────────────────┘
>> 심볼을 사용하여 기존의 화일에 새로운 내용을 추가하는 것을
보여주고 있다.
명령어상에서 동일 화일명이 입력과 출력에 대해 사용되면, 기존의 화일
내용이 덮어 씌워지게 된다.
예를들면, cat names morenames > names라고 지정했을 경우, names 화일은
morenames 화일의 내용만을 갖게 된다. 이는 쉘이 우선 방향전환 심볼의
우측에 지정된 화일을 비운후 명령을 실행하기 때문이다.
names 화일이 비어졌기 때문에, cat 명령어에 전달되는 입력은 mornames
화일의 내용뿐이다. 즉 덮어쓰기가(overwrite) 수행된 것이다.
이러한 사고로 인한 화일 내용의 소실을 막기 위해서 입력과 출력 화일명은
다르게 지정해야 한다.
---------------------------------------------------------------------------
Pipe와 Tee를 통한 방향전환(Redirection)
파이프를 이용한 출력 방향전환
---------------------------------------------------------------------
1. 명령어로의 출력 방향전환(Pipeline)
유닉스의 파이프(Pipe)는 두개 또는 그 이상의 명령어들을 연속하여
연결시키기 위한 방식이다. 이 방식은 명령어의 실행 결과가 방향전환
된다는 측면에서 특정 화일로의 출력 방향전환과 유사하나, 명령어로의
출력 방향전환 기능은 불필요한 화일의 생성을 하지 않아도 된다는
잇점을 제공한다. (이부분에 대한 자세한 설명은 후속되는 예제에서
다시 언급한다.) 파이프 심볼(|)은 다른 명령어로의 출력 방향전환을
나타낸다. 표준 입력을 받아들이고, 표준 출력을 생성하는 명령어들은
파이프 라인에서 사용될수 있다. (여기서 파이프 라인이란 파이프를
사용하여 복수개의 명령어를 나열한 명령어 라인을 의미한다.)
파이프 심볼을 사용하는 예는 다음과 같다.
┌────────────────────┐
│ command1 | command2 | command3 ... │
└────────────────────┘
파이프 라인에서 각각의 부가적인 명령어는 |(파이프) 심볼의
앞에 위치된다.
( 예제 )
┌───────────────────┐
│화일로의 명령어 출력 방향전환 방식 │ 이 예에서의 첫번째 방식은
│ │ 시스템상의 현재의 사용자 수를
│ $who > users.tmp │ 계산하기 위하여 화일로의
│ $wc -l < users.tmp │ 명령어 출력 방향전환 방식을
│ $rm users.tmp │ 사용하고 있다. who 명령어의
│ │ 출력은 users.tmp 화일에
│파이프 라인을 이용하는 방식 │ 저장되고, wc -l 명령어에 의해
│ │ 화일내에 저장된 내용의 라인수를
│ $who | wc -l │ 계산하여 화면상에 표시한다.
└───────────────────┘ 이후 users.tmp 화일은 사용자
수를 계산하기 위해 일시적으로 필요로하는 화일 이었기 때문에 rm 명령어를
사용하여 삭제하고 있다. 이 예에서 알수 있듯이, 이와같은 작업 수행은
화일을 생성하고, 삭제해야 하는 번거로움이 있다. 이런경우 두번째 예와
같이 파이프 라인을 이용하면 매우 효율적으로 작업을 할 수 있다.
( 이유는 화일을 생성및 삭제할 필요가 없기 때문이다. )
┌──────────────────────────┐
│화일로의 명령어 출력 방향전환 방식 │
│ │
│ $cat names morenames > allnames │
│ $sort allnames > allnames.srt │
│ $lp allnames.srt │
│ │
│파이프 라인을 이용하는 방식 │
│ │
│ $cat names morenames | sort | lp │
└──────────────────────────┘
이 예에서는 복수개의 파이프 심볼을 하나의 명령어 라인에서 지정하는
방식을 보여준다.
wc 와 sort 같은 몇몇 명령어들은 몇가지 방식으로 입력을 변형하거나
변경하고, 변경된 데이타를 출력한다. 이러한 명령어들을 필터(filter)라
부른다. 이러한 명령어들은 파이프 라인에서 자주 사용된다.
2. 복수개의 목적지(Destination)로의 출력 방향전환
tee 명령어는 명령어의 표준출력을 하나 이상의 화일에 저장함과 동시에
그 출력을 표준출력 처리하여 화면상에 표시한다. tee 명령어의 처리형식은
다음과 같다.
┌───────────────────────────┐
│ command [-option] [arguments] | tee [-a] file(s) │
└───────────────────────────┘
tee 명려어상에 지정한 file이 이미 존재하는 화일일 경우에는 이 명령은
본래의 내용을 덮어 쓰게된다.(overwrite) 이로인한 화일 내용의손실을
피할수 있도록 하기위해 -a 옵션이 제공된다. -a 옵션이 지정되면, 대상
화일에 새로운 내용을 추가한다.(append)
( 예제 )
┌─────────────────┐
│ $pr report1 | tee report1.pr │
└─────────────────┘
이 예는 report라는 화일을 pr 명령어를 사용하여, 프린트 형식으로
변환하고 있다. pr 명령어는 프린트 형식으로 변환한 다음 그내용을
화면상으로 출력해 주는데, 이 예에서는 파이프를 사용하고 있기
때문에 화면상에 출력될 표준 출력이 tee 명령어에 전달된다. 이후
tee 명령어는 그 표준출력을 report1.pr이라는 화일에 저장함과 동시에
화면상에 표시한다.
┌─────────────────────┐
│ $pr report2 | tee -a report1.pr | lp │
└─────────────────────┘
이 예에서는 -a 옵션을 사용함으로써, report2라는 화일이 기존에 존재할
경우에 발생할 수 있는 화일의 손실을 방지하고 있다.
┌──────────────────────────────┐
│ $pr inventory | tee -a inventory.pr /dev/term/14 | lp │
└──────────────────────────────┘
이 예에서는 inventory 화일을 프린트 형식으로 변환하고, 그 내용을
inventory.pr 화일과 /dev/term/14라는 화일에 저장하는 작업을 수행한다.
이때 /dev/term/14 화일은 특정 단말과 데이터를 주고받기 위한 특수화일로
그 화일에 저장되는 내용은 단말에 표시된다. 그리고 tee 명령어에 의해
생성된 표준출력은 다음의 파이프에 의해 lp 명령어의 표준입력으로
처리된다.
---------------------------------------------------------------------------
에러 메세지의 출력 방향전환(Redirection)
---------------------------------------------------------------------
명령어에 의해 생성된 에러 메세지는 쉘에의해 표준 출력과 동일한 터미널의
스크린인 표준에러(Standard Error)로 보내진다. 이러한 출력 방향도> 심볼을
사용하여 특정 화일로 변경할 수 있다. 이 심볼은 표준 출력의 방향전환과
동일한 것이 사용되기 때문에, 혼돈을 막기 위해 부가적인 구별이 필요하다.
┌──────────────────────┐
│ command [-option] [arguments] 2> file │
└──────────────────────┘
아래에 나열되어 있는 화일 디스크립터(Descriptor)는 각각의 화일들 즉,
표준 입력, 표준 출력 그리고 표준에러를 명확하게 지정하기 위해 사용된다.
0 표준 입력(Standard Input)
1 표준 출력(Standard Output)
2 표준 에러(Standard Error)
화일 디스크립터는 방향전환 바로 앞에 지정한다. 예를들면 1> 는 표준 출력을
참조하며, 2> 는 표준 에러를 참조한다. prgm 2>errfile이라는 지정은 쉘에게
표준 에러를 errfile에 보낼 것을 지시한다. 표준 입력(0<)과 표준 출력(1>)의
지정 형식은 혼돈을 막기 위해서만 사용한다.
다음은 표준 에러를 제어하는 예이다.
┌─────────────────┐ 이 예에서는 3개의 화일의
│$cat file1 file2 nofile > combo │ 표준 출력을 combo 화일에
│cat: cannot open file │ 출력 방향전환을 시도하고
│$cat combo │ 있다. 그러나 이 화일들중
│This is file 1. │ nofile은 기존에 존재하지
│This is file 2. │ 않는 화일을 지정함으로써
└─────────────────┘ 에러를 발생시키고 있다.
그런데 정상적으로 지정한 file1과 file2 화일의 내용은 combo 화일에
저장되는데 nofile 지정으로 인해 생성된 메세지는 저장되지 않고
화면상에 곧장 표시되는 것을 볼수 있다. 이는 표준 출력과 표준 에러가
명백히 다르게 처리된다는 것을 알수있게 해준다.
┌────────────────────┐ 이번에는 표준 출력과
│$cat file1 file2 nofile 1>combo 2>oops │ 표준 에러를 별도의
│$cat combo │ 화일에 저장하도록
│This is file 1. │ 지정한 예이다.
│This is file 2. │ 명령 실행후 두 화일의
│$cat oops │ 내용을 확인함으로써
│cat: cannot open nofile │ 별도로 처리되었음을
└────────────────────┘ 확인할 수 있다.
여기에서 cat oops 명령 실행후 표시되는 메세지를 혼돈하지 않기 바란다.
┌───────────────────┐ 이 예제는 표준 출력과
│$cat file1 file2 nofile 1>combo 2>&1 │ 표준 에러를 동일 화일에
│$cat combo │ 저장하는 방식을 보여주고
│This is file 1. │ 있다. 표준 에러 방향전환을
│This is file 2. │ 위해 지정한 심볼의 뒤에
│cat: cannot open nofile │ &1이 지정된 것을 유의해야
└───────────────────┘ 한다.
& 심볼은 특정의 화일 디스크립터에 메세지를 추가할 것을 지시하며, 이때의
특정의 화일은 & 심볼 뒤에 기술되는 화일 디스크립터의 번호이다.
---------------------------------------------------------------------------
프로세스(Process)와 제어 명령: ps
프로세스와 ps 명령어
---------------------------------------------------------------------
1. 프로세스(Process)
프로세스는 프로그램의 실행이다. 명령어 라인이 실행될때 프로세스가
시작된다.
1) 프로세스 구조
유닉스 화일 체제와 마찬가지로, 프로세스의 구성은 계층적 구조이다.
유닉스 화일과 같이 프로세스들도 부모 프로세스(Parent Process)와
자식 프로세스(Child Process)로 구성된다. 부모 프로세스는 또다른
프로세스를 분기할 수 있는 자식 프로세스를 생성한다.
Fork와 Spawn은 프로세스의 생성에 관련된 용어들이다.
시스템이 시동될때 시작되는 첫번째 프로세스는 init 프로세스이다.
시스템 최상위 관리자(이를 Superuser라 한다.)인 root와 같이, 모든
프로세스의 최상위 프로세스는 init이다.
2) 명령어 실행
명령어 라인이 실행될때, 쉘은 대부분 명령어를 실행하기 위해
자식 프로세스를 분기한다. 자식 프로세스가 실행중인 동안에,
부모 프로세스는 휴면상태(sleep)라 불리우는 활동하지 않는 상태가
된다. 휴면상태에 있는 프로세스는 시스템으로 부터 실행을 위한 서비스를
받지 않고 대기상태에 있게 된다. 자식 프로세스는 실행을 완료된때,
종료하게 된다. 이때 부모 프로세스는 휴면상태를 벗어나 실행을
계속하게 된다.
3) 프로세스 식별자
프로세스가 분기될때, 유닉스는 프로세스에 대해 유일한 번호를 부여한다.
이때 프로세스에 부여되는 번호가 PID라 불리우는 프로세스 식별자이다.
( 프로세스 식별자로 사용되는 번호의 범위는 1부터 32767까지이다. )
프로세스는 존재하는 동안에는 동일한 PID 번호를 유지한다.
init 프로세스의 프로세스 식별자는 항상 PID 1 이다.
몇몇 명령어는 명령 실행 결과의 출력으로써 PID를 표시한다. ps 명령어는
프로세스에 관련된 상태 정보를 제공한다. kill 명령어는 프로세스를
종료한다.
2. 프로세스 상태의 표시
ps 기동중인 프로세스에 대한 정보를 표시한다.
┌────────────────┐
│ ps [-option] [arguments] │
└────────────────┘
ps 명령어는 명령어상에 지정한 옵션에 따라서 기동중인 프로세스들에
대한 정보를 표시한다. 명령어 출력은 여러개의 필드로 구성되어 있는데,
각각의 필드에 대한 제목은 옵션 지정에 따라 표시 또는 생략된다.
예를들면, -f 옵션은 8개의 필드로 구성된 출력을 표시하나, -l 옵션은
15개의 필드를 표시한다. 출력되는 필드의 설명은 이후에 설명한다.
또한 명령어상에 여러개의 옵션을 같이 사용할 수 있다. 몇몇 옵션은
인자(Arguments)들의 목록을 받아들인다. 만일 옵션이 지정되지 않았을
경우에는 현재 터미널에서 작업중인 사용자가 기동중인 프로세스들에
대한 정보가 표시된다. 이 경우 출력은 프로세스 식별명, 터미널 식별명,
누적적인 실행시간 그리고 명령어 이름을 포함한다.
( 옵션 )
-a 다른 사용자가 기동한 프로세스가 기동한 프로세스들에 대한
정보를 프린트한다.
-f 8개 필드로 구성된 출력을 표시한다.
-l 15개 필드로 구성된 출력을 표시한다.
-e 현재 실행중인 모든 프로세스에 관련된 정보를 표시한다.
( Running 상태인 프로세스들에 대한 정보 )
-u (user) 지정한 user가 기동한 프로세스에 대한 정보를 표시한다.
-t (terminal)
지정한 터미널에서 수행중인 터미널에서 수행중인 프로세스
정보를 표시한다.
( 출력 필드 설명 )
F 프로세스에 부여된 플러그(flag)
S 프로세스 상태
UID 프로세스를 기동한 사용자 식별명
PID 프로세스 식별명
PPID 부모 프로세스 식별명
C 최근에 프로세스가 사용한 CPU 시간
PRI 프로세스 우선 처리순위(높은 숫자가 낮은 우선순위를 의미한다.)
NI 우선순위 계산에 사용되는 값
ADDR 프로세스의 메모리 주소(Address)
SZ 메모리내의 프로세스 크기
WCHAN 프로세스가 휴면상태이거나 대기상태일 경우의 주소
( 이 필드가 공백일 경우는 프로세스가 실행중이라는 것을 의미 )
STIME 프로세스의 시작 시간
TTY 프로세스가 기동한 터미널
TIME 프로세스가 기동된 누적 시간
COMD 프로세스를 기동되게 한 명령어 이름
-f 옵션을 지정하면 전체 명령어 라인이 표시된다.
다음은 ps 명령어를 실행한 예이다.
┌──────────────┐ 옵션없이 ps 명령을 실행한 예
│$ps │
│ PID TTY TIME COMD │
│11558 term/12 0:01 login │
│11566 term/12 0:02 sh │
│11680 term/12 0:00 ps │
└──────────────┘
┌────────────────────────────────┐
│$ps -f │
│ UID PID PPID C STIME TTY TIME COMD │
│user2 1067 1066 3 05:58:47 term/12 0:01 -sh │
│user2 1085 1067 23 05:59:52 term/12 0:00 ps -f │
│ root 1066 684 0 05:58:39 term/12 0:01 /usr/bin/login │
└────────────────────────────────┘
-f 옵션을 실행한 예로 8개의 필드가 표시되었다.
주목할 것은 COMD 필드에 표시된 명령어 부분이다.
즉; 명령어 라인 전체가 표시되는 특징이 있다.
간혹 TTY 필드에는 ?가 표시되는 경우가 있는데, 이는 Background Daemon
임을 의미한다.
┌──────────────────────────────────┐
│$ps -l │
│ F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME COMD │
│10 S 105 1067 1066 1 30 20 c06d05f8 28 d11ce000 term/12 0:01 sh │
│10 O 105 1084 1067 16 50 20 c06d0b98 22 term/12 0:00 ps │
│10 S 0 1066 684 0 30 20 c06d0520 67 d1174600 term/12 0:01 login │
└──────────────────────────────────┘
가장 자세한 정보가 표시되고 있다.
여기에서 플러그 필드(F)에 표시된 10이라는 숫자는 현재 기본 메모리상에서
수행중인 프로세스임을 나타낸다. 또한 상태 필드(S)에 나타난 S는 휴면상태
를 의미하며, O는 프로세서에 의해 실행중임을 의미한다.
┌────────────┐ -a 옵션을 사용하여 다른 사용자가 실행한
│$ps -a │ 프로세스의 정보들을 표시해 주고 있다.
│ PID TTY TIME COMD │
│19694 term/16 0:01 ksh │
│21917 term/00 0:02 ksh │
│23058 term/10 0:00 sh │
│23101 term/10 0:00 ps │
└────────────┘
┌────────────┐
│$ps -u newuser -u user5 │ 특정 사용자가 개시한 프로세스들의
│ PID TTY TIME COMD │ 정보들만을 표시하고 있다.
│ 1090 term/13 0:01 sh │
│ 1113 term/13 0:00 ps │
│23058 term/10 0:00 sh │
│23101 term/10 0:00 ps │
└────────────┘
┌────────────┐ 특정 단말에서 개시한 프로세스 정보들을
│$ps -t term/10 │ 표시하고 있다.
│ PID TTY TIME COMD │
│19694 term/10 0:01 sh │
│21917 term/10 0:02 date │
└────────────┘
---------------------------------------------------------------------------
다양한 형태의 명령어 실행 방식
명령어 실행
---------------------------------------------------------------------
1. 명령어 실행의 응용
지금까지의 강의에서 설명되었던 명령어들은 한번에 하나의 명령어씩
실행하는 방식으로 실행하는 예제들을 중심으로 소개되었다.
특별한 환경이나 필요에 따라서는 명령어들을 다음과 같은 여러가지 형식으로
응용하여 실행할 수 있다.
. 명령어들은 ;(세미콜론)을 이용하여 동일 명령어 라인상에 여러개를 동시에
지정하여 실행할 수 있다.
. 여러개의 명령어들의 조합된 출력을 얻기위해 둥근괄호를 사용하여
함께 묶을수 있다.
. 명령어들을 &(Ampersand)를 이용하여 백그라운드에서 실행할 수 있다.
위와같은 방식들은 이후 하나씩 자세히 설명된다.
2. 복수개의 명령어 실행
명령어 라인이 실행될때, 쉘은 명령어 프로그램을 실행하기 위해 하나의
프로세스를 생성하고(분기하고), 그 프로세스가 종료될때까지 자신은
휴면상태가(sleep) 된다.
┌─────────┐분기┌────────┐
│ 현재의 프로세스 ├─> │ 자식 프로세스 │
└─────────┘ └────────┘
이때 사용자는 그 프로세스가 실행되는 동안에는
다른 명령어들을 실행할 수 없다. 복수개의 명령어들을 실행하기 위해
각 명령들이 종료될때까지 기다려서 다음 명령을 실행하는 방식대신에,
하나의 명령어 라인에 복수개의 명령어를 지정함으로써 한번의 실행 요구를
통해 여러개의 명령을 실행할 수 있다.
┌──────────────────┐
│ command1 ; command2 ; command3 │
└──────────────────┘
세미콜론(;)은 하나의 명령어 라인에서 여러개의 명령어를 지정할 수 있게
해준다. 각각의 명령어는 세미콜론에 의해 구분된다. 키는
명령어 라인의 끝임을 쉘에게 알려줌으로써 명령어 라인을 실행하도록
한다. 세미콜론 전후의 공백 지정상에 대한 규칙은 없으나, 관습상 전후에
공백을 지정한다. 명령어 라인상에 지정된 명령어들은 지정 순서에 따라
순차적으로 실행된다.
다음은 세미콜론을 이용하여 복수개의 명령어를 동일 명령어 라인상에
지정하는 방식을 보여주는 예이다.
┌───────────────────┐
│$date ; pwd ; who │
│Mon Aug 12 09:28:50 EDT 1991 │
│/home/user2 │
│user2 term/12 Aug 12 09:30 │
│newuser term/10 Aug 12 10:47 │
└───────────────────┘
3. 명령어의 그룹화
┌──────────────┐
│ (command1 : command2) │
└──────────────┘
복수개의 명령어들을 세미콜론으로 구분하여, 둥근괄호로 둘러 쌓음으로써
복수개의 명령어가 그룹화될 수 있다. 쉘은 하나의 작업으로써 둥근괄호내의
명령어들을 실행하고, 필요시에 자식 프로세스를 분기한다. 이때에도 그룹속의
명령어 실행 순서는 변함없다. 명령어의 그룹화 방식은 일반적으로 복수개
명령어의 조합된 출력을 얻기위해 사용한다.
다음은 그룹화의 예제이다.
┌──────────────┐
│$(pwd ; ls -al) > file.1st │
└──────────────┘
이 예에서 pwd 와 ls 명령어가 순차적으로 실행된다. 두 명령어의 출력은
file.1st 화일에 저장된다. 여기서 만약 둥근괄호를 지정하지 않았다면
어떻게 될까?. pwd 화일의 출력은 화면상으로 표시되고, ls 명령어의
출력만이 file.1st 화일에 저장될 것이다.
┌────────────────────┐
│$pwd │
│/home/user5 │
│$(cd /etc ; ls -al) │
│(ls -al /etc의 명령어 출력이 표시된다.) │
│. │
│. │
│$pwd │
│/home/user5 │
└────────────────────┘
둥근괄호로 둘러 쌓여있는 명령어들은 서브쉘에 의해 수행된다. 예를들면,
cd 명령어는 서브 쉘에서 실행되는 동안에만 적용된다. 그룹화 명령내에서
cd 명령어가 실행되었음에도 불구하고, 그룹화 명령 실행 전후에 현재의
작업 디렉토리가 변경되지 않는 이유가 여기에 있다.
쉘 프로그램에서 사용하는 또다른 그룹화 명령인 브레이스({}) 심볼을
사용하면, 그룹화 명령들이 현재의 쉘에서 수행되기 때문에 위와 같은 경우
실제로 디렉토리 이동이 행해지게 된다.
---------------------------------------------------------------------------
Background에서의 명령어 실행
백그라운드에서의 명령어 실행
---------------------------------------------------------------------
1. 백그라운드에서의 명령어 실행
보통 쉘 프로세스는 사용자가 요구한 명령어를 실행하는 동안에
비활성(Inactive) 상태를 유지한다. 그렇기 때문에 다른 명령어는
직전의 명령어가 종료되고, 쉘 프로세스가 입력을 받아들이기 위해
프롬프트를 표시할 때까지 실행할 수 없는 것이다. 이러한 형태의
작업처리 작업들을 Foreground Job이라 한다. 따라서 사용자는
여러개의 명령어를 실행하는 경우에는 각각의 명령어가 종료될때까지
기다려야 하는 시간상의 낭비를 초래하게 된다.
이런경우 명령어들을 Background Job으로 실행할 수 있다.
명령어가 Background Job 형식으로 실행 요구된 경우에는, 쉘 프로세스는
사용자가 Foreground에서 또다른 명령어를 실행할 수 있게 해준다.
통상 Background Job은 긴시간이 요구되는 프로그램에서 사용한다.
특정 작업을 Background에서 실행하기 위해서는 해당 작업을 기술한
명령어 라인상의 끝 부분에 & 심볼을 지정한다.
┌───────┐
│ command& │
└───────┘
이와같이 &를 지정한 경우 쉘은 프로그램의 실행 요구를 받아들여
기동되었음을 알려주기 위해 자동적으로 개시된 프로세스의 PID(프로세스
식별자)와 사용자가 다른 명령어를 입력할 수 있도록 쉘 프롬프트를
표시한다. Background 프로세스는 시스템 차원에서 실행되어지며,
실행 완료후 프로세스가 생성한 출력을 표준 출력 즉 단말 스크린상으로
표시한다.
이런 이유때문에 통상 Background Job에서는 출력 방향전환(Redirection)이
사용되게 된다.
쉘의 한종류인 Korn Shell에서는 명령어 실행시의 다양한 제어 방식을
제공하나 이 부분에는 차후에 강의될 쉘의 개요 부분에서 자세히 설명한다.
이때의 제어방식을 한번 예를 들자면, 사용자가 요구한 작업을 Background에
위치시키거나, Foreground에 위치시키거나, 한쪽의 작업을 다른쪽에
위치시키는등의 제어와 작업을 중지시키는 제어등이다.
┌──────────────┐
│$pgm5 stats > stats.pgm5& │
│1238 │
└──────────────┘
이 예에서는 사용자가 작성한 프로그램인 pgm5를 Background에서
실행하고 있다. 또한 명령어의 실행결과 출력이 Foreground상의
명령어 출력과 동시에 출력됨으로써 야기되는 혼돈을막기위해,
stats.pgm5라는 화일에 저장되도록 출력 방향전환이 행해지고 있다.
명령어 실행요구가 내려진후 쉘에의해 프로세스 식별자(PID)가
표시되는 것을 볼수 있다. 이때 되돌려지는 프로세스 식별자는
프로세스 제어 명령인 kill과 ps 같은 명령어에서 특정 작업을 지칭하기
위한 정보로 이용되니 주의깊게 봐야한다.
┌─────────────┐
│$ls -al /etc& pwd │
│3318 │
│/home/eps │
│(ls -al /etc output ) │
│ . │
│ . │
│ . │
└─────────────┘
위의 예는 동일 명령어 라인상에서 Foreground 와 Background
작업실행 요구를 내리는 경우를 보여주고 있다. 예제의 명령어 라인에서
& 이전에 기술된 명령어는 Background에서 실행되게 되며, 그 이후에
기술되어 있는 명령어는 Foreground에서 실행된다.
이때의 실행 결과의 출력은 각 명령어의 실행 소요시간에 따라서
출력되게 된다. 이 예에서는 pwd 명령어의 실행시간이 ls 명령보다
짧은것으로 가정하여 pwd 명령의 결과가 먼저 표시되고 있다.