为什么我的陷阱不打印任何日志消息?

为什么我的陷阱不打印任何日志消息?

我正在做的是,

trap 'rm -f /path/of/file/fileName.running; echo "TRAPPED & READY";' 1 2 9 15 >> trap.log

我在日志中没有收到任何内容,应该删除的文件仍然存在,我不确定哪个信号可以在脚本运行时停止脚本,因为我只是杀死脚本正在使用的服务器。

注意:如果该文件存在,我的 Cron 计划作业将不会运行,并且我认为我没有错过任何可能的信号。我哪里错了?

答案1

你的问题的一部分是你有>> trap.log(引用的)命令arg的外部,所以你在文件中得到的trap.log只是命令本身的输出trap——这什么也没有。我不确定你的脚本终止时说“TRAPPED & READY”是什么意思,但看起来你的意思是

陷阱 'rm -f文件名;回声”信息“ >> trap.log'信号规范……

我同意 Karlo 的观点:如果您“只是杀死脚本正在使用的服务器”,那么脚本很可能正在退出(而不是被信号杀死),您应该使用EXIT(或等效地,0sigspec (可能除了12、 和15)。

PS 您不需要;在命令 arg 末尾添加分号 ( ) trap

答案2

使用EXIT而不是信号编号。

下面的脚本对我有用。我使用常量。

> cat test.sh
#!/bin/bash

trap 'echo trap' EXIT

echo 'Program running'
sleep 1

> ./test.sh
Program running
trap

来自 bash 联机帮助页:

如果 sigspec 为 EXIT (0),则在退出 shell 时执行命令 arg。如果 sigspec 是 DEBUG,则命令 arg 在每个简单命令、for 命令、case 命令、select 命令、每个算术 for 命令之前以及在 shell 函数中执行第一个命令之前执行(请参阅上面的 SHELL GRAMMAR)。有关其对 DEBUG 陷阱的影响的详细信息,请参阅内置 shopt 的 extdebug 选项的说明。如果 sigspec 为 RETURN,则每次使用 .shell 函数或脚本执行时都会执行命令 arg。或源内置程序完成执行。

相关内容