tee 명령을 이용하여 셸 스크립트의 파이프를 디버깅하는 방법

3917 단어 shell파이프tee

인스턴스


다음은 간단한 스크립트입니다. 스크립트에서processid 함수의 역할은 지정한 프로세스 이름의 프로세스 ID를 조회하는 것입니다. linux 서버를 관리하는 과정에서 흔히 볼 수 있는 기능입니다.processid 함수 역할은 다중 파이프 명령을 이용하여 프로세스 ID를 조회하는 것입니다. 다음은 스크립트 원본 코드를 테스트하는 것입니다.

#!/bin/sh

processid()
{
    ipid=$(ps -ef | grep -w $1 | grep -v grep | awk '{print $2}')
    echo $ipid
}

case "$1" in
    i)
       processid $2
      ;;
    *)
        echo "parameter error..$1"
      ;;
esac

실행 스크립트


저희가 이 스크립트를 실행해서 zone9_log1의 프로세스 ID, 다음은 실행 결과입니다.

[wanng@localhost ~]$ ./a.sh i zone9_log1
130530 144391 144392
zone9을 위해_log1 프로세스의 실제 프로세스 ID 대비, ps-ef | grep-w zone9_log1 | grep-v grep | awk'{print $2}'명령, 실행 결과는 다음과 같습니다.

[wanng@localhost ~]$ ps -ef | grep -w zone9_log1 | grep -v grep | awk '{print $2}'
130530

문제


같은 명령은 확실히 다른 결과를 얻었다. 우리는 스크립트에 tee 명령을 넣어 파이프의 중간 결과를 출력했다. 조정된 스크립트는 다음과 같다.

processid()
{
    ipid=$(ps -ef | grep -w $1 | tee out1 | grep -v grep | tee out2 | awk '{print $2}') | tee out3
    echo $ipid
}

case "$1" in
    i)
       processid $2
      ;;
    *)
        echo "parameter error..$1"
      ;;
esac
스크립트를 다시 실행하면 로컬에서 out1out2out3 세 개의 파일을 생성하고 이 파이프 명령의 중간 결과를 기록합니다. 다음은 스크립트 실행 결과와 out1out2out3 파일의 내용입니다.

[wang@localhost ~]$ ./a.sh i zone9_log1
130530 144885 144886

[wang@localhost ~]$ cat out1
wang      130530      1  0 4 24 pts/10  00:07:47 ./zone9_log1 ./zone9_log1.lua
wang       144885 109338  0 20:45 pts/8    00:00:00 /bin/sh ./a.sh i zone9_log1
wang       144886 144885  0 20:45 pts/8    00:00:00 /bin/sh ./a.sh i zone9_log1
wang       144888 144886  0 20:45 pts/8    00:00:00 grep -w zone9_log1
[wang@localhost ~]$ cat out2
wang      130530      1  0 4 24 pts/10  00:07:47 ./zone9_log1 ./zone9_log1.lua
wang       144885 109338  0 20:45 pts/8    00:00:00 /bin/sh ./a.sh i zone9_log1
wang       144886 144885  0 20:45 pts/8    00:00:00 /bin/sh ./a.sh i zone9_log1
[wang@localhost ~]$ cat out3
130530
144885
144886
[wang@localhost ~]$ 

원인


스크립트를 실행할 때, 기본적으로 새로운 셸 (즉 새로운 프로세스) 을 만들 것입니다. 위의 스크립트 a.sh는 새로운 셸 환경에서 실행됩니다.위의 테스트 결과를 보면 ps-ef | grep-w zone9_log1 명령의 결과에는 발 자체로 시작하는 프로세스와 조회할 대상 프로세스가 포함되어 있습니다. 스크립트 자체의 프로세스를 필터링하면 정확한 프로세스 ID를 얻을 수 있습니다. 조정된 스크립트는 다음과 같습니다. (tee 명령 출력의 중간 결과를 잠시 보류하십시오.)

processid()
{
    ipid=$(ps -ef | grep -w $1 | grep -v $0 | tee out1 | grep -v grep | tee out2 | awk '{print $2}') | tee out3
    echo $ipid
}

case "$1" in
    i)
       processid $2
      ;;
    *)
        echo "parameter error..$1"
      ;;
esac
위processid 함수에서grep-v $0은 스크립트의 이름을 필터하는 역할을 합니다. 그 중에서 $0은 스크립트의 이름을 표시합니다. (a.sh)

검증


스크립트를 다시 실행합니다. 결과는 다음과 같습니다.

[wanng@localhost ~]$ ./a.sh i zone9_log1
130530

[wanng@localhost ~]$ cat out1
wanng      130530      1  0 4 24 pts/10  00:07:51 ./zone9_log1 ./zone9_log1.lua
wanng       146170 146168  0 21:11 pts/8    00:00:00 grep -w zone9_log1
[wanng@localhost ~]$ cat out2
wanng      130530      1  0 4 24 pts/10  00:07:51 ./zone9_log1 ./zone9_log1.lua
[wanng@localhost ~]$ cat out3
130530
위의 테스트 결과에서 알 수 있듯이 마지막 출력의 결과는 정확하다

총결산


다중 파이프는 셸 스크립트에서 흔히 볼 수 있는 용법으로 사용하기도 편리하고 효율적이지만 스크립트가 문제가 생기면 디버깅이 어려워지고tee 명령을 합리적으로 사용하여 파이프의 중간 결과를 출력하여 문제를 신속하게 포지셔닝할 수 있다
이상은 tee 명령을 이용하여 셸 스크립트의 파이프를 디버깅하는 방법에 대한 상세한 내용입니다. 더 많은 tee 명령 디버깅 셸 스크립트의 파이프에 대한 자료는 저희 다른 관련 글을 참고하세요!

좋은 웹페이지 즐겨찾기