2

我在 shell 脚本中有一个要求,如果 shell 由于某种原因终止,即终端关闭或用户终止,我想做一些工作,比如清理和解锁等。这可能吗?如果是这样,请解释如何完成。在此先感谢,普拉文 PB

4

2 回答 2

7

对的,这是可能的。trap使用命令检查信号。见help trap

例子

cleanup() {
    ...
    exit
}

trap cleanup SIGINT # user terminated
trap cleanup SIGHUP # terminal closed
trap cleanup SIGTERM # killed with kill -15
于 2013-05-21T10:14:51.560 回答
1

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

  • 您没有指出操作系统(和外壳,但我们假设sh),所以为了保持 POSIXly 正确,您应该使用大写的信号名称(如SIGINT)。也见这里

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

  • 不要忘记在以其他方式退出脚本之前手动调用您的“清理”函数(即在“脱落”结束之前或每当您手动调用时exit)。或者注册一个处理程序trap cleanup EXIT

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

于 2013-05-21T10:42:33.210 回答