我试图捕获对 stdout (或 stderr)的写入,但显然实际数据与退出事件相关。我编写了一个简单的 C 程序,用于写入 stdout 和 stderr。
#include <stdio.h>
int
main()
{
printf("Standard output\n");
fprintf(stderr, "Standard error\n");
return 0;
}
我用“gcc example.c -o example”编译它。如果我现在启动 sysdig
sudo sysdig --unbuffered -X syscall.type=write and proc.name=example
并运行 ./example,我得到以下输出
91612 20:12:09.273696708 2 example (12909) > write fd=1(<f>/dev/pts/1) size=16
91613 20:12:09.273726879 2 example (12909) > write fd=2(<f>/dev/pts/1) size=15
不显示任何数据,仅显示输入事件 (>)。此外,标准输出凿子不会产生任何输出
sudo sysdig --unbuffered -X -c stdout syscall.type=write and proc.name=example
问题出在我的示例程序中还是出在哪里?如果我在没有任何参数的情况下运行 sysdig,它有时还会显示某些进程的退出事件。
我运行的是 Ubuntu 20.04 发行版,sysdig 的版本是 0.26.4。有关 sysdig 的更多信息,请参阅sysdig 的 GitHub 存储库。
答案1
显然 Ubuntu 附带的版本存在一些问题。我从sysdig网站下载了最新版本(0.27.1),现在结果是正确的:
65099 19:55:54.695520567 7 example (10805) > write fd=1(<f>/dev/pts/0) size=16
65102 19:55:54.695526434 7 example (10805) < write res=16 data=
0x0000: 5374 616e 6461 7264 206f 7574 7075 740a Standard output.
65103 19:55:54.695528110 7 example (10805) > write fd=2(<f>/dev/pts/0) size=15
65104 19:55:54.695529507 7 example (10805) < write res=15 data=
0x0000: 5374 616e 6461 7264 2065 7272 6f72 0a Standard error.