Category Archives: 리눅스서버관리

리눅스상에서 사용할수 있는 멀티 리다이렉트(Mutiple Redirect)

리눅스를 사용하면서 항상 마주치는 표준입력(stdin)과 표준아웃(stdout)들의 세계는 매우 오묘하면서도 재미있는것이 많이 있는 영역이 아닐까 생각됩니다. 보통의 프로그램을 실행할때는 항상 함수나 메서드 단위로 실행되고 그것에 인자값들(Arguments)을 넘겨주어 사용하게 되는데요, 리눅스(굳이 유닉스니 기타 다양한 계열의 다른것들을 끌어들이진 않을께요;;)에서는 이런걸 뛰어넘어 다양한 방법으로 입/출력을 할 수 있습니다. 매력적이죠.

그럼 본론으로 들어가 보겠습니다. 보통의 리다이렉션은 다음과 같은 키워드를 사용합니다.

[code]>, <, >>, 2>&1[/code]
차례대로 오른쪽으로 표준출력, 왼쪽으로 표준입력, 오른쪽으로 표준출력(Append)입니다. 마지막의 2는 표준에러(stderr) 1은 표준출력(stdin)을 뜻합니다. 표준에러를 표준출력에 합쳐서 리다이렉트 하겠다는 뜻이죠.

하지만 이것은 일방적으로 하나의 목적(Target)을 가질 수 밖에 없습니다. 그렇다면 다중 출력을 하려면 어떻게 하면 좋을까요? 다행이도 tee라는 양방향 출력을 하는 명령이 존재합니다.

[code]COMMAND | tee >(PROCESS1) >(PROCESS2) >(PROCESS3) | PROCESS4[/code]
tee명령에서 >()을 사용하게 되면 세부 명령을 수행할 수 있습니다. 정확히는 ()가 세부명령이고 그 앞의 >가 표준입출력이 되겠군요. 다음의 간단한 예제를 볼까요.

[code]echo “hello” | tee >(less) >(more) | tail -f
hello
hello
hello[/code]
조금 억지 예제이긴 하지만 less, more, tail을 통해 3번을 출력하게 되는것을 알 수 있습니다. 동시에 여러 파일을 쓰고 싶다면? 여기서 조금만 더 확장해 보겠습니다.

[code]echo “hello” | tee >(less > a) >(more > b) >(tail > c) >(head > d) | tail -f
cat a

hello
cat b
hello
cat c
hello
cat d
hello[/code]
세부 명령들에서도 표준 출력이 잘 되는 것을 알 수 있습니다. 생각보다 써먹을데가 많은 명령이지만 첫번째 명령에서 파이프(Pipe)로 넘어오기 때문에 사실상 실시간의 멀티 스트리밍은 할 수 없습니다.

참고: http://linux.byexamples.com/archives/144/redirect-output-to-multiple-processes/

[쉘스크립트] 쉘스크립트로 다수의 작업을 병렬처리 하기

사용자 삽입 이미지

간단하게 두세가지 작업을 수행해야 하는데 이 작업들이 모두 끝나는 시점에 수행해야 하는 작업이 있습니다. 보통 두세가지 작업을 동시에 하려면 &(Ampersand)를 붙여 백그라운드 작업으로 돌리면 해결될 문제입니다. 하지만 모두 끝나는 시점에 무언가를 해야 한다면 조금 생각해볼 문제가 되겠죠.

생각을 해보면 작업을 수행할때마다 PID값을 알아내어 이 PID가 끝나길 기다렸다가 끝나는대로 다음 작업을 수행하면 될 것 같습니다. 이런 경우를 위해 wait라는 명령이 bash쉘에 Builtin되어있습니다. 간단하게 다음의 예제를 확인해 보겠습니다.

#!/bin/sh

echo "예제를 시작합니다"

sleep 10 &
sleep 15 &

echo "모든 명령이 병렬로 실행되었습니다"

WORK_PID=`jobs -l | awk '{print $2}'`
wait $WORK_PID

echo "모든 명령이 종료되었습니다"

이 예제를 실행해 보면 다음과 같은 결과를 보여줍니다.

예제를 시작합니다
모든 명령이 병렬로 실행되었습니다
모든 명령이 종료되었습니다

jobs명령의 경우 -l옵션을 붙여주게 되면 PID값도 함께 출력되게 됩니다. 이것을 이용하면 굳이 매번 프로세스를 실행할때마다 PID를 저장하려는 노력을 하지 않아도 됩니다.

[eye@theeye ~]# sleep 500 &
[1] 4962
[eye@theeye ~]# jobs
[1]+  Running                 sleep 500 &
[eye@theeye ~]# jobs -l
[1]+  4962 Running                 sleep 500 &

이런 명령을 활용하여 복잡한 여러 스크립트들의 수행속도를 꽤 많이 단축시킬 수 있었습니다.