我正在尝试创建一个我拥有的脚本:
tcpdump (options) | fgrep (options) > file
用CTRL + C终止tcpdump后,我想要执行这些命令:
sed (options) file | awk (options)
wait
rm file
第一部分已经完成但是在我按下CTRL + C后,我会被提示抛出。我尝试了等待,陷阱SIGINT,同样的问题。
现在明白了:为什么不简单地管理所有内容而不将中间未过滤的输出转储到临时文件中?好吧,我试过了,但似乎信息在我的屏幕输出中丢失(繁忙的服务器,不知道),我发现打破这样的命令将允许我有完整的输出。
更新: 基于我在下面得到的答案,我尝试这样做,它似乎是最安全的方式使它工作:
function1 ()
{
tcpdump (options) | fgrep (options) > file
trap "function2" SIGINT SIGTERM
}
function2 ()
{
sed (options) file | awk (options)
wait
rm -i file
}
它不起作用。生成“file”但其内容似乎没有被sed |读取和过滤我执行CTRL + C之后的awk语法,甚至没有被rm命令删除,因此这进一步证明了辅助陷阱函数没有被执行。我不明白这种行为,我做错了吗?
更新2:我能让它正常工作的唯一方法就是:
set -m
tcpdump (options) | fgrep (options) > filename &
trap "kill -9 $!" SIGINT
sed (options) filename | mawk (options)
\rm filename
但我无法抑制输出杀死后台进程,尝试了我能找到的所有解决方案: Running bash commands in the background without printing job and process ids - 这个使我的陷阱失去功能; With Bash Scripting, how can I suppress all output from a command? - 这里的所有变种都不起作用,无论我做什么,我仍然可以得到输出。尝试定义$!使用另一个变量,尝试了/ dev / null的所有变体,尝试将其放在trap命令中,没有用。
答案 0 :(得分:0)
您是否可以在后台启动tcpdump
命令并在一段固定时间后终止它?例如。运行
(tcpdump (options) | fgrep (options) > file) &
然后获取流程的pid并等待一段时间,
pid=$!
sleep 60
最后终止命令并解析输出
kill -9 $pid
sed (options) file | awk (options)
rm file
<强>更新强>
如果您真的希望Ctrl-P
停止tcpdump
,trap
就是您要走的路。但是,在执行trapped命令后,您将始终以shell结束!所以你描述的行为实际上是trap
应该做的事情。
因此,您可以将trap
命令编写为
trap "{ sed (options) file | awk (options); rm file; }" SIGINT SIGTERM
它应该对中断执行所有后处理。如果您拥有的不仅仅是这些简单的命令,那么将所有后处理命令放在新的脚本或函数中会更有意义,例如
exec_on_interrupt() {
sed (options) file | awk (options)
rm file
# other stuff...
}
trap "exec_on_interrupt" SIGINT SIGTERM