文件系统写入看似丢失

文件系统写入看似丢失

我一直在尝试 tcpdump,并且发现了一些非常奇怪的文件系统行为。这看起来不是 tcpdump 问题,我稍后会解释。

以下命令不生成文件:

tcpdump -w test.pcap

然而,此命令会按预期生成 PCAP 文件:

tcpdump -w - > test.pcap

起初我认为 tcpdump 在写入 shell 没有遇到的文件时一定遇到了一些错误,所以我进行了跟踪,发现写入发生得很好!

open("test.pcap", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4 
fstat(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff9bf5cb000
rt_sigaction(SIGUSR1, {0x4557d0, [], SA_RESTORER, 0x7ff9bea2ab60}, {SIG_DFL, [], 0}, 8) = 0 
write(2, "tcpdump: ", 9tcpdump: )                = 9 
write(2, "listening on eth0, link-type EN1"..., 73listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes) = 73
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
write(4, "\324\303\262\241\2\0\4\0\0\0\0\0\0\0\0\0\377\377\0\0\1\0\0\0001\2\210P\34\3\3\0"..., 4096) = 4096
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
write(4, "\232\241\4\17X\213\f9+\225\35\t\364QF\223\242\7\217Y\226\373l\231vQ\354\223\250i\336."..., 4096) = 4096
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
write(4, "\34\226\346%\354\210\342\331\377\373\222d\261\0\5\207wX\6i`\0U\260\350\260\300\250\0\16\335\241"..., 4096) = 4096

test.pcap 作为文件描述符 4 打开,然后对该描述符进行多次写入,系统调用报告实际上已写入请求的字节数。

即使如此,也不会创建任何文件。我在文件系统中搜索了 test.pcap,但什么也没找到。

什么会产生这种行为?

tcpdump version 4.3.0
libpcap version 1.3.0
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
Linux persephone 3.4.9-gentoo #1 SMP Wed Oct 3 10:02:39 EDT 2012 x86_64 Intel(R) Xeon(R) CPU E5645 @ 2.40GHz GenuineIntel GNU/Linux

答案1

tcpdump正在对文件执行其他操作。你没有说出完整的命令行是什么;也许你-G那里有一个。

进一步调查的可能方法:-

  1. 继续查看 strace 输出:也许您会发现重命名或取消链接。
  2. 当 tcpdump 运行时,运行一下ln test.pcap pin.test.pcap,您将能够知道该文件稍后是否已取消链接。
  3. 当 tcpdump 运行时,找到其进程 ID 并ls -l /proc/${pid}/fd查看是否可以找到指向打开文件的完整路径名的链接。 (根据 @Gilles 的评论,这是实际有效的方法。

相关内容