我在shell脚本中有一个要求,如果shell由于某种原因终止,终端关闭或用户终止,我想做一些工作,如清理和解锁等。有可能吗?如果是这样,请解释如何完成。 提前致谢, Praveen P B
答案 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%安全失败。