Чрезвычайно медленное dnf

В ksh, bash и zsh, time не является командой (встроенной или нет), это зарезервированное слово в языке, как for или while.

Оно используется для временной привязки конвейера1.

В:

time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir

У вас есть специальный синтаксис, который говорит оболочке запустить этот трубопровод:

for i in 1 2; do cmd1 "$i"; done | cmd2 > redir

И сообщить статистику по времени для него.

In:

time cmd > output 2> error

Это то же самое, вы синхронизируете команду cmd > output 2> error, и статистика синхронизации все еще идет на stderr оболочки.

Вам нужно:

{ time cmd > output 2> error; } 2> timing-output

Или:

exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-

Чтобы stderr оболочки был перенаправлен на timing-output перед использованием конструкции time (опять же, не command) (здесь для time cmd > output 2> error 3>&-).

Вы также можете запустить эту конструкцию time в subshell, у которой перенаправляется stderr:

(time cmd > output 2> error) 2> timing-output

Но эта подоболочка здесь не нужна, вам нужно, чтобы stderr перенаправлялся только в момент вызова конструкции time.

В большинстве систем также есть команда time. Вы можете вызвать ее, отключив ключевое слово time. Все, что вам нужно сделать, это заключить это ключевое слово в кавычки, поскольку ключевые слова распознаются как таковые только в буквальном смысле.

'time' cmd > output 2> error-and-timing-output

Но учтите, что формат может отличаться, и stderr как time, так и cmd будет объединен в error-and-timing-output.

Также, команда time, в отличие от конструкции time, не может таймировать конвейеры или составные команды, или функции, или встроенные модули оболочки...

Если бы это была встроенная команда, она могла бы засекать время вызовов функций или встроенных команд, но не могла бы засекать время перенаправлений, трубопроводов или составных команд.


1 Обратите внимание, что bash имеет (что можно рассматривать как) ошибку, при которой time (cmd) 2> file (но не time cmd | (cmd2) 2> file, например) перенаправляет вывод тайминга в file

. 121---24338-

Поскольку процесс является дочерним для оболочки, которую вы открыли по ssh, этот процесс будет завершен, как только вы выйдете из оболочки, например. например, при отключении.

Вы можете использовать различные методы, чтобы обойти это:

  1. Запустите программу с помощью nohup (без зависания) и откажитесь от нее:

    nohup somecommand &
    disown %1
    

    Это перенаправит весь вывод в файл $PWD/nohup.out, если вы хотите отбросить вывод, направьте его в /dev/null (между somecommand и &)

  2. Используйте терминальный мультиплексор, например GNU Screen или tmux:

    tmux
    #Inside tmux
    somecommand
    

    Затем отсоединитесь от сессии tmux, используя Ctrl+B, затем D. Теперь вы можете спокойно отключиться. Когда вы захотите вернуть сессию tmux в другой оболочке, просто выполните

    tmux a
    

    Теперь вы вернулись в оболочку, из которой вышли.

4
26.01.2019, 01:22
1 ответ

Роберт :Было бы интересно узнать, какой системный вызов занимает больше всего времени.

Можно ли установить простой (случайный )пакет, используя трассировку производительности, а затем выполнить сортировку для поиска самых длинных вызовов?

Например :#perf trace -s -o /tmp/trace.out dnf install -y xorg -x11 -apps -7.7 -20.fc28.x86 _64

А затем опубликуйте содержимое вашего файла /tmp/trace.out. Это сводный файл, поэтому он не должен быть слишком большим, но он поможет указать, какие системные вызовы (с )занимают больше всего времени и выходят ли они за пределы нормального диапазона.

1
27.01.2020, 21:01

Теги

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