Shell脚本终止通知

时间:2013-05-21 10:10:55

标签: shell

我在shell脚本中有一个要求,如果shell由于某种原因终止,终端关闭或用户终止,我想做一些工作,如清理和解锁等。有可能吗?如果是这样,请解释如何完成。 提前致谢, Praveen P B

2 个答案:

答案 0 :(得分:7)

是的,这是可能的。使用trap命令检查信号。请参阅help trap

示例

cleanup() {
    ...
    exit
}

trap cleanup SIGINT # user terminated
trap cleanup SIGHUP # terminal closed
trap cleanup SIGTERM # killed with kill -15

答案 1 :(得分:1)

@Grzegorz说的是正确的,但请注意以下几点:

  • 您没有指明操作系统(和shell,但我们假设sh),因此要保持POSIX正确,您应该使用大写信号名称(如SIGINT)。另请参阅here

  • 除非您希望让脚本继续运行,否则在收到信号后,您应该将exit作为“清理”功能的最后一行。

  • 在通过其他方式退出脚本之前(即在“脱落”结束之前或手动调用exit时),不要忘记手动调用“清理”功能。或者使用trap cleanup EXIT注册处理程序。

  • 请注意,您无法通过此方式(或任何其他方式)捕获SIGKILL,即kill -9 <mypid>。因此,请确保您可以以某种方式处理清理实际上的事实。例如,在脚本初始化期间检查旧的(孤立的)锁定文件是否仍然存在并退出并显示错误,告诉用户/管理员手动清理。现在,区分合法存在的锁定文件和被杀死实例的保留文件可能并不简单,在很大程度上取决于您的脚本。您可以将脚本PID写入锁文件,然后,如果存在锁文件时(脚本的另一个实例)找到锁文件,请确保具有该PID的进程仍然存在,如果存在,则可能另一个脚本实例正在运行。否则,可能需要手动清理。但即便如此,也不是100%安全失败。