【发布时间】:2017-03-21 20:53:11
【问题描述】:
我正在尝试创建一个我拥有的脚本:
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
}
它不起作用。生成了“文件”,但 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 的所有变体,尝试将其放在陷阱命令中,没有用。
【问题讨论】:
标签: bash tcpdump terminate bash-trap