Как получить информацию в основной программе-обработчике - PullRequest
0 голосов
/ 11 сентября 2018

Я прошел Именование файлов дампа ядра

В этом документе рассказывается, как получить идентификатор процесса, имя хоста и т. Д. Это работает очень хорошо, если настроено так:

echo "|/var/core_interceptor/bin/hello %P %u %g %s %t %c %e %h %d %E %i %p" > /proc/sys/kernel/core_pattern

ИЛИ

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 вызывается, но не печатает аргументы:

$ cat text1.txt 
Called

Почему я могу получить аргументы в Cпрограмма, но не в Python?

1 Ответ

0 голосов
/ 13 июня 2019

Вы, наверное, уже поняли это, но ваша программа, скорее всего, выдает исключение, потому что вы передаете аргумент типа 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']
...