2017-12-12 19 views
2

私はbashに関数を持っています。これは単に "seconds"と呼ばれ、経過秒数を表示します。現在、それは別のプロセスで実行され、親プロセスは完了したらそれを強制終了します。トラップを使用して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

2つのこと:

  1. それを殺すためにkill -9を使用しないでください。 SIGKILLは入手できません。ターゲットプロセスがクリーンアップを行うことはできません。信号をSIGTERMに送信するには、平文のkillを実行してください。

  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" 
関連する問題