我正在做的是,
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
(或等效地,0
)sigspec
(可能除了1
、2
、 和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。或源内置程序完成执行。