此文档说明了如何获取进程ID,主机名等。如果配置如下:
echo "|/var/core_interceptor/bin/hello %P %u %g %s %t %c %e %h %d %E %i %p" > /proc/sys/kernel/core_pattern
OR
echo "|/var/core_interceptor/bin/systemd-coredump %P %u %g %s %t %c %e %h %d %E %i %p" > /proc/sys/kernel/core_pattern
#include <stdio.h>
#define FILE_NAME "/var/core_interceptor/bin/text.txt"
int main(int argc, char *argv[])
{
int i = 0;
FILE* file_ptr = fopen(FILE_NAME, "w");
for (i = 0; i < argc; i++)
fprintf(file_ptr, "\n%s", argv[i]);
fclose(file_ptr);
return 0;
}
此hello.c
除了将其写入文本文件外没有做任何其他事情。当我看到生成的文件时,我看到了所有带有值的参数,即我看到了实际的PID等。
但是,当我像这样配置python程序时:
echo "|/var/core_interceptor/bin/pyhandler.py %P %u %g %s %t %c %e %h %d %E %i %p" > /proc/sys/kernel/core_pattern
在创建的文件中我没有得到任何参数。
$ cat pyhandler.py
#!/usr/bin/python
import sys
f = open("/var/core_interceptor/bin/text1.txt", "w")
f.write("Called")
f.write(sys.argv[0:])
f.close()
此py脚本被调用,但不显示args:
$ cat text1.txt
Called
为什么我可以在C程序中获取args,而不能在python中获取?
答案 0 :(得分:0)
您可能已经发现了这个问题,但是您的程序很可能引发异常,因为您正在将类型为list的参数提供给期望类型为str的方法。
示例程序:
cat arg_writer.py
#!/usr/bin/env python3.6
import sys
with open("/tmp/output.txt", "w") as output:
output.write(sys.argv[0:])
执行:
./arg_writer.py
Traceback (most recent call last):
File "./arg_writer.py", line 6, in <module>
output.write(sys.argv[0:])
TypeError: write() argument must be str, not list
[crknight@tbs5g-dev-san-02 tmp]$
如果在编写之前将列表强制转换为字符串形式,则可能会得到所需的内容:
#!/usr/bin/env python3.6
import sys
with open("/tmp/output.txt", "w") as output:
output.write(str(sys.argv[0:]))
示例输出:
cat /tmp/output.txt
['./arg_writer.py']