Вопрос или проблема
Возможно ли, чтобы ваша история 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 сохраняла общее время выполнения каждой команды?
Для достижения поставленной цели необходимо внедрить системный подход с максимальной автоматизацией процессов. Ниже описаны шаги, которые позволят достичь требуемого результата:
-
Понимание функциональности Bash и системных вызовов:
Bash использует системные вызовыwait3
иwait4
для обработки дочерних процессов, однако, по умолчанию, не возвращает информацию о ресурсах (например, время выполнения) в стандартный вывод. Это связано с тем, что указательstruct rusage
передается какNULL
. -
Использование команды
time
:
Для фиксации времени выполнения каждой команды, можно предварять каждую команду ключевым словомtime
. Это даст информацию о времени выполнения, которую можно затем сохранить в bash history. Однако, такой подход требует интерсептации стандартного вывода, который содержит информацию об общем времени выполнения. -
Автоматизация через скрипты оболочки:
Для автоматизации процесса можно настроить обертывание каждой команды в скрипт, который запускает её с использованием командыtime
. Скрипт будет сохранять команду и результатtime
в отдельный файл.Пример скрипта:
command_logger() { { time "$@" ; } 2>> ~/.command_times.log echo "$@" >> ~/.bash_history } alias myexec='command_logger'
Для использования:
myexec your_command_here
-
Анализ и модификация исходного кода Bash:
Для соответствия функцииtime_command
с сохранением истории, необходимо модифицировать исходный код Bash с целью записи результатовgetrusage(2)
в историю команд. Это требует навыков программирования и сборки пользовательской версии Bash. -
Настройка HISTTIMEFORMAT:
Чтобы знать время начала выполнения команды, определите переменную HISTTIMEFORMAT, что позволит записывать метки времени в исторический файл Bash:HISTTIMEFORMAT='%F-%T '
-
Интеграция с системой:
Внедрение приведенных решений в работу вашей системы требует соответствующей интеграции. Для этого, например, добавьте переменные и алиасы в стартовые скрипты (например,.bashrc
).
В заключение, доступные решения затрагивают либо серьезные изменения в системе (поиск и модификация исходного кода), либо разработку вспомогательных скриптов, поддерживающих функционал фиксации времени выполнения команд. Так или иначе, цель комплексного и автоматизированного управления историей команд может быть достигнута через грамотное применение вышеописанных методов.
Если у вас остались вопросы или требуется реализация более специфического решения, рекомендую обратиться к специалистам в области администрирования Linux систем.