Отфильтровать неудачные системные вызовы из журнала strace

Да. Это возможно. Но если ваш сценарий будет длиннее, я рекомендую сделать это в других командах, используя ControlMaster , как это делает Ansible, иначе вы потеряетесь во всех кавычках, обратных косых чертах и ​​прочем, что вы можете увидеть в своем сообщении.

scp script1.sh remote:/tmp/
ssh remote "bash /tmp/script.sh"

и ваш script.sh могут содержать еще один аналогичный пакет с удаленной машины на другую. Также сценарий может содержать rm /tmp/script.sh для самоочистки.

4
07.04.2018, 12:41
3 ответа

Además de publicar -el procesamiento de la salida strace, no hay nada disponible para ignorar las llamadas al sistema fallidas en strace. No sería demasiado difícil de agregar, mire la función syscall_exiting_traceensyscall.c.

Si prefiere seguir el ángulo de procesamiento posterior -, Ole Tange ya se ha encargado de eso por usted de una manera más completa de lo que es probable que llegue aquí :el La herramientatracefileejecutará stracey filtrará la información que está buscando de una manera muy legible. Consulte Listar los archivos a los que accede un programa para obtener más detalles. Otra respuesta a esa pregunta enumera otros enfoques posibles, incluido LoggedFS que encuentro muy útil.

Otra opción es usar SystemTap ; por ejemplo

#!/usr/bin/env stap

global stored_filename, stored_path

probe syscall.open {
  stored_filename = filename
}

probe syscall.open.return {
  if (execname() == "cat" && $return >= 0) {
    printf("opened %s\n", stored_filename)
  }
}

probe syscall.openat {
  stored_filename = filename
  stored_path = dfd_str
}

probe syscall.openat.return {
  if (execname() == "cat" && $return >= 0) {
    printf("opened %s in %s\n", stored_filename, stored_path)
  }
}

mostrará el nombre de cualquier archivo abierto con éxito por cualquier proceso cat.

4
27.01.2020, 20:51

Возможное решение:

strace -e trace=file sleep 1 2>&1 | grep -v "= -1 ENOENT" > strace.log

straceпо умолчанию выводит на stderr, поэтому перенаправьте его на stdout.

2
27.01.2020, 20:51

Несколько более надежным шаблоном (, т.е. несколько меньшим риском случайного пропуска неправильных строк ), может быть

| grep -v "= -1 ENOENT [(]No such file or directory[)]$"

Т.е. скопируйте -вставьте конец строки, «избегая» квадратных скобок (, которые в противном случае могли бы рассматриваться как специальные символы ), и добавьте специальный символ $в конец, который «привязывает» шаблон к концу линии.

Я не могу найти лучшего варианта в man strace. Быстрые и грязные манипуляции с текстом — это Unix Way :-P.

Почти наверняка можно делать то, что вы хотите, с помощью пользовательского сценария gdb. Однако это больше работы, и у меня нет готового сценария.

Другой вопрос относится к сценарию tracefile, который можно запустить с параметром -e. Это по-прежнему реализуется путем анализа вывода strace, поэтому он также не кажется полностью надежным, но я думаю, возможно, вы бы предпочли его.https://gitlab.com/ole.tange/tangetools/blob/master/tracefile/tracefile

1
27.01.2020, 20:51

Теги

Похожие вопросы