2012-11-17 7 views
1

두 개의 FIFO 사이에 입/출력 통신을 허용하도록 IO 스크립트를 설정하려고합니다 (하나의 FIFO는 입력 용이고 다른 하나는 출력용입니다).bash에서 프로세스가 파괴되었는지 확인 하시겠습니까? (가능성이 SIGINT 잡으려고)

입력을 입력하는 동안 내 서버가 출력을 수신해야합니다. Internals/servoutInternals/servin은 모두 FIFO입니다. 현재 입력을 기다리는 동안 백그라운드에서 tail을 실행하여이를 구현합니다.

이 내 현재 코드입니다 : 내가 실수로 스크립트를 종료 Ctrl-C를 입력 할 때

#!/bin/bash 
# io.sh 

tail -f -n 0 Internals/servout & 
tpid=$! 

read -p ">> " v 
while [ $? -eq 0 ] && [ "$v" != "exit" ] && [ "$v" != "quit" ]; do 
     echo $v > Internals/servin 
     sleep .2 
     read -p ">> " v 
done 

kill $tpid 

내가 실행 해요 가장 큰 문제입니다. 이 경우 tail -f -n 0 Internals/servout & 코드가 백그라운드에서 계속 실행됩니다. 당신이 상상할 수 있듯이 그것은 바람직하지 않습니다.

SIGINT 또는 유사한 신호를 보냈더라도 tail 명령이 종료되도록하는 방법이 있습니까? 나는 파이썬에서 finally 키워드와 동일한 목적을 달성 할 수있는 무엇인가를 생각 중이거나, 을 사용하여 tail 명령을 현재 스크립트의 프로세스에 의존하게 만든다.

제 나쁜 습관에 대해 자유롭게 의견을 말하십시오 - bash은 제 최신 언어 중 하나이며 건설적인 비판은 개선 할 수있는 가장 빠른 방법입니다.

+0

있지만, 모두'SIGKILL'이 나쁘다는 것을 알고 있습니다.) 그렇지 않으면,'['는 더 이상 쓸모가 없으므로 이중 대괄호'[['. 또 다른 한가지로, 'sleep'은 초 단위의 정수를 잠자 운다. 그래서'sleep .2'는 당신이 기대하는 것을하지 않을 것입니다. –

+0

허,'함정 '명령에 대해 몰랐어. 맨 페이지 검색을 할 시간이야! 'sleep .2' 명령의 주제에 관해서, 그것은 내가 필요로하는 것을 정확히 수행합니다 - 1/5 초 동안 잠을 자지. 'NUMBER가 정수 여야하는 대부분의 구현과 달리 여기 NUMBER는 임의의 부동 소수점 수입니다.'라고 로컬 문제이기 때문에 플랫폼 특이성에 대해 걱정할 필요가 없습니다. – Kupiakos

답변

1

당신이 뭔가를 시도 할 수 있습니다 :

#!/bin/bash 
# io.sh 

cleanup() { 
    [[ -n $tpid ]] && kill $tpid 
} 

trap 'cleanup' SIGHUP SIGINT SIGTERM EXIT 

tail -f -n 0 Internals/servout & 
tpid=$! 

quitflag=0 
while ((!quitflag)) && read -p ">> " v; do 
    case $v in 
     exit | quit) 
      quitflag=1 
      ;; 
     help | '?') 
      echo "Sorry, I can't help you." 
      ;; 
    esac 
    echo "$v" > Internals/servin 
done 
당신은 SIGKILL``로 살해하지 않는 스크립트가 (사망 할 때`tail` 죽일`함정 '킬 $의 TPID'SIGHUP SIGINT SIGTERM`를 사용할 수