bash history, который сохраняет время выполнения?

Вопрос или проблема

Возможно ли, чтобы ваша история bash сохраняла общее время выполнения каждой выполняемой вами команды?

т.е. как если бы каждая команда начиналась с ‘time’, и результат сохранялся в истории вместе с командой?

уточнение: я уже знаю, что можно добавить время запуска команды – но хотелось бы знать общее время выполнения, а не только время запуска.

Использование дочернего процесса устанавливается где-то внутри системных вызовов wait3 или wait4 через указатель struct rusage (wait4(2)). В исходниках bash мы находим:

$ egrep -r 'wait[34][[:blank:]]*\(' .
./jobs.c:   wait3 ((union wait *)statusp, options, (struct rusage *)0)
./jobs.c:   wait3 (statusp, options, (struct rusage *)0)
./jobs.c:   wait3 (statusp, options, (int *)0)
$

Пустой (struct rusage *)0 означает, что использование ресурсов не будет возвращено bash. Поиск struct rusage действительно показывает функцию time_command в execute_cmd.c, и, похоже, это собирает информацию об использовании через getrusage(2). Однако это относится к TIMEFORMAT встроенной функции time и, похоже, не пересекается с кодом истории. Без изменения bash, думаю, придется воспользоваться какой-то уловкой, связанной с выполнением всего под time и захватом стандартной ошибки, на которой отображается информация о времени, в какой-то файл?

Определив HISTTIMEFORMAT в ваших стартовых скриптах, вы получите временную метку на каждой строке файла истории bash. Значение этой переменной – это то, как (*) временные метки должны быть напечатаны на экране. Вот моя:

HISTTIMEFORMAT='%F-%T '

(*) Смотрите man 3 strftime (если у вас его нет, man date должен помочь)

.

Ответ или решение

Вопрос: Можно ли сделать так, чтобы bash history сохраняла общее время выполнения каждой команды?

Для достижения поставленной цели необходимо внедрить системный подход с максимальной автоматизацией процессов. Ниже описаны шаги, которые позволят достичь требуемого результата:

  1. Понимание функциональности Bash и системных вызовов:
    Bash использует системные вызовы wait3 и wait4 для обработки дочерних процессов, однако, по умолчанию, не возвращает информацию о ресурсах (например, время выполнения) в стандартный вывод. Это связано с тем, что указатель struct rusage передается как NULL.

  2. Использование команды time:
    Для фиксации времени выполнения каждой команды, можно предварять каждую команду ключевым словом time. Это даст информацию о времени выполнения, которую можно затем сохранить в bash history. Однако, такой подход требует интерсептации стандартного вывода, который содержит информацию об общем времени выполнения.

  3. Автоматизация через скрипты оболочки:
    Для автоматизации процесса можно настроить обертывание каждой команды в скрипт, который запускает её с использованием команды time. Скрипт будет сохранять команду и результат time в отдельный файл.

    Пример скрипта:

    command_logger() {
       { time "$@" ; } 2>> ~/.command_times.log
       echo "$@" >> ~/.bash_history
    }
    alias myexec='command_logger'

    Для использования:

    myexec your_command_here
  4. Анализ и модификация исходного кода Bash:
    Для соответствия функции time_command с сохранением истории, необходимо модифицировать исходный код Bash с целью записи результатов getrusage(2) в историю команд. Это требует навыков программирования и сборки пользовательской версии Bash.

  5. Настройка HISTTIMEFORMAT:
    Чтобы знать время начала выполнения команды, определите переменную HISTTIMEFORMAT, что позволит записывать метки времени в исторический файл Bash:

    HISTTIMEFORMAT='%F-%T '
  6. Интеграция с системой:
    Внедрение приведенных решений в работу вашей системы требует соответствующей интеграции. Для этого, например, добавьте переменные и алиасы в стартовые скрипты (например, .bashrc).

В заключение, доступные решения затрагивают либо серьезные изменения в системе (поиск и модификация исходного кода), либо разработку вспомогательных скриптов, поддерживающих функционал фиксации времени выполнения команд. Так или иначе, цель комплексного и автоматизированного управления историей команд может быть достигнута через грамотное применение вышеописанных методов.

Если у вас остались вопросы или требуется реализация более специфического решения, рекомендую обратиться к специалистам в области администрирования Linux систем.

Оцените материал
Добавить комментарий

Капча загружается...