Вопрос:

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

python linux coredump

21 просмотра

1 ответ

99 Репутация автора

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

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

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

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

Автор: sheikh sabeer Источник Размещён: 10.09.2018 10:21

Ответы (1)


0 плюса

1 Репутация автора

Вы, наверное, уже поняли это, но ваша программа, скорее всего, выдает исключение, потому что вы передаете аргумент типа 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']
Автор: chrisknight32 Размещён: 12.06.2019 09:07
Вопросы из категории :
32x32