bash - 在 bash 中使用 trap 终止函数

标签 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. 不要使用 kill -9 来终止它。 SIGKILL 是无法捕获的。它不会让目标进程进行任何清理。只需执行简单的 kill 即可发送 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"

关于bash - 在 bash 中使用 trap 终止函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47772128/

相关文章:

bash - 在每个时间 block 之间添加空行

python - 为什么在 python 中主进程退出时子进程 (daemon=True) 不退出?

C#/单声道 : get list of child processes on Windows and Linux

c - 分配 :what can "corrupt" allocated memory in Linux/Qt application (threads involved)?

c - C语言获取Linux系统信息

目录上的 Bash For 循环

bash - .zshrc 分配类型不一致?

unix - 有没有办法获得有关 Unix 进程的非常精确的信息(使用的字节数、CPU 指令数)?

liferay - 使动态添加的 portlet 具有与调用 portlet 相同的 scopeGroupId

java - C 进程和 JAVA 应用程序之间的 FIFO 问题