2017-12-12 26 views
2

bash에 함수가 있는데, 단순히 "경과 된 시간 (초)"을 표시하는 "타이머"라고합니다. 현재는 별도의 프로세스로 실행되며, 부모 프로세스가 완료되면이를 종료합니다.트랩을 사용하여 bash에서 함수를 종료하십시오.

필자는 신호를 어떻게 든 잡아 내고 우아하게 종료하는 기능을 원합니다. 그것은 지금처럼 여기 예제 스크립트입니다 :

#!/bin/bash 

function timer() { 

    t0=$(date +%s) 

    while true ; do 
    t=$(date +%s) 
    echo -en "\r$(($t - $t0))" 
    done 
} 

timer & 
pid=$! 
echo $pid 

sleep 5 # do something while timer runs 
echo "done" 
kill -9 $pid 

답변

3

두 가지 :

  1. 을 죽일 kill -9를 사용하지 마십시오. SIGKILL은 검색 할 수 없습니다. 대상 프로세스가 정리 작업을 수행 할 수 없습니다. 을 사용하여 SIGTERM 신호를 보냅니다.

  2. SIGTERM에 걸릴 수 있습니다. SIGINT을 잡아서 Ctrl-C를 잡을 수도 있습니다. 또는 스크립트가 어떻게 죽든지 상관없이 정리를 수행하려면 EXIT을 트랩하십시오.

function timer() { 
    trap 'echo -e "\ntimer stopped"' EXIT 

    t0=$(date +%s) 

    while true ; do 
    t=$(date +%s) 
    echo -en "\r$(($t - $t0))" 
    done 
} 

timer & 
pid=$! 
echo "$pid" 

sleep 5 # do something while timer runs 
echo "done" 
kill "$pid"