使用陷阱在bash中终止函数

时间:2017-12-12 12:00:43

标签: bash process ipc

我在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

1 个答案:

答案 0 :(得分:3)

两件事:

  1. 不要使用kill -9来杀死它。 SIGKILL无法访问。它不会让目标进程进行任何清理。只需做一个简单的kill即可发送SIGTERM信号。

  2. 您可以在SIGTERM上进行陷阱。您还可以在SIGINT上捕获以捕获Ctrl-C。或者最好的是,无论脚本如何被杀死,都要在EXIT上进行清理以进行清理。

  3. 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"