【发布时间】:2021-10-18 16:51:45
【问题描述】:
尝试通过使用sh -c ': > /proc/sys/kernel/core_pattern' 清除/proc/sys/kernel/core_pattern 来摆脱Ubuntu 的apport 不起作用。
看起来O_TRUNC 标志在写入/proc 文件系统时被忽略了:
echo nonsense >| /proc/sys/kernel/core_pattern
strace sh -c ': > /proc/sys/kernel/core_pattern # do not call apport'
...
openat(AT_FDCWD, "/proc/sys/kernel/core_pattern", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...
close(3) = 0
cat /proc/sys/kernel/core_pattern
nonsense
在常规文件系统而不是 /proc 文件系统中执行此操作时,我得到一个空文件。
这是内核错误还是功能,甚至可能是记录在案的?
编辑:通过sysctl清除此设置不起作用:
sysctl kernel.core_pattern=""
sysctl: malformed setting "kernel.core_pattern="
似乎 sysctl 程序无法清除任何内核参数,而 man core 明确描述了一个空值用于禁用该机制。
是的,echo >| /proc/sys/kernel/core_pattern 可以代替,但这个问题的目的是找出这是否是内核错误,而不是找到解决方法。
【问题讨论】:
-
尝试将零长度缓冲区写入文件。如果这不起作用,请尝试只写一个换行符。
-
顺便说一句,修改
/proc/sys/文件的常用方法是使用sysctl命令。例如。sudo sysctl kernel.core_pattern=. -
/proc 上的文件有点奇怪,因为它们的内容是动态生成的,它们的大小被列为 0。
-
@IanAbbott,刚刚编辑了问题以表明
sysctl在这里不起作用。但这无论如何都不是问题的对象。 -
可以说,由于文件的大小为 0(如
stat所示),因此无法截断。
标签: linux-kernel system-calls procfs sysctl