Почему strace не сообщает, что родительский shell fork() дочернего процесса перед execve() команды?

Решение с awk может быть следующим:

awk '/Analytics code start/ { t=1; print; system("cat myanalytics.txt") } 
     /Analytics code end/   { t=0 } 
     t==0 { print } ' index.html

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

Вкратце объяснение:

  • Когда t == 0 всегда печатать текущую строку
  • Если текущая строка соответствует «Начало кода аналитики» установить t == 1 ], а затем распечатайте текущую строку и нужный файл с помощью системы ("cat myanalytics.txt")
  • Теперь t равно 1 , поэтому текущая строка никогда не печатается, но когда текущая строка совпадает с "Конец кода аналитики" , t снова устанавливается на 0 , поэтому с этого момента следует печатать текущую строку.

Примечание:

Это не приведет к редактированию вашего файла index.html . Для изменения индекса .html вы можете:

  • перенаправить вывод из awk во временный файл, а затем использовать команду типа mv или cp

  • использовать ] sponge из пакета moreutils , как показано ниже:

     awk '[.. команды, как указано выше ..]' index.html | sponge index.html 
     
1
03.03.2016, 01:26
2 ответа
$ strace -f time
execve("/usr/bin/time", ["time"], [/* 66 vars */]) = 0
brk(0)                                  = 0x84c000
...

Strace напрямую вызывает программу для трассировки. Он не использует оболочку для выполнения дочерних команд, если только дочерняя команда не является вызовом оболочки. Примерная последовательность событий здесь следующая:

  1. Оболочка выполняет strace с аргументами strace, -f, time.
  2. Strace запускается, анализирует свою командную строку и в конечном итоге выполняет разветвление.
  3. Исходный (родительский) процесс strace начинает трассировку дочернего процесса strace.
  4. Дочерний процесс strace выполняет / usr / bin / time с аргументом «время».
  5. Запускается временная программа.

После шага 1 исходный процесс оболочки простаивает, ожидая выхода strace. Он ничего не делает активно. И даже если бы он что-то делал, strace не отслеживает это, поэтому его активность не будет отображаться в выводе strace.

6
27.01.2020, 23:11

Рассматриваемый fork является частью механизма, запускающего strace; он завершился к моменту начала трассировки.

4
27.01.2020, 23:11

Теги

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