В конвейере команды выполняются одновременно. В том-то и дело, что вывод одного подается другому в режиме реального времени.
Статус выхода команды известен только тогда, когда она возвращается. Если вы хотите, чтобы awk
обработал вывод foo
, а также получил доступ к его статусу выхода, вам нужно будет запуститьawk
послеfoo
после сохранения вывода foo
где-то вроде:
foo > file
awk -v "rc=$?" '{print rc, $0}' < file
В качестве альтернативы вы могли бы awk
запускать foo
сам по себе (ну, все еще через оболочку для интерпретации командной строки ), читать ее вывод (через канал через его cmd | getline
интерфейс наpopen()
)и получить статус выхода с помощью:
awk -v cmd=foo '
BEGIN {
while ((cmd | getline) > 0) {
print
}
rc = close(cmd)
print rc
}'
Однако обратите внимание, что способ awk
кодирования состояния выхода варьируется от одной awk
реализации к другой. В одних это статус прямо как возвращенный waitpid()
или pclose()
, в других это тот, что разделен на 256 (даже когда foo
убит сигналом )... хотя вы должны быть в состоянии полагайтесь на rc
равным 0 тогда и только тогда, когда команда была успешной.
В случае с gawk
, оно недавно изменилось .
Или вы могли бы передать статус выхода в конце через канал:
(foo; echo "$?") | awk '
{saved = $0}
NR > 1 {
# process the previous line
$0 = prev
print "output:", $0
}
{prev = saved}
END{rc = prev; print rc}'
(предполагая, что вывод foo
заканчивается символом новой строки, когда он не пустой (является действительным текстом )).
Или подается по отдельной трубе. Например, в Linux и с оболочкой, отличной от ksh93:
{ : extra pipe | { (foo 3<&-; echo "$?" > /dev/fd/3) | awk '
{print}
END {getline rc < "/dev/fd/3"; print rc}'
} 3<&0 <&4 4<&-; } 4<&0
Если что-то не так, нельзя судить по выводу lscpu. Я никогда не видел, чтобы текущая частота была намного ниже минимальной, но, учитывая сложность процессора, это тоже не удивительно. Регулятор мощности может с помощью состояний ACPI повышать производительность для повышения производительности или уменьшать или регулировать тактовую частоту для снижения энергопотребления и нагрева для каждого ядра ЦП в отдельности. Он также может вставлять STOPCLOCK, где ЦП может пропускать тактовые импульсы. У AMD есть Cool'n'Quiet и PowerNow! которые могут повлиять на напряжение и частоту. Материнская плата имеет влияние и, возможно, даже блок питания. Но особенно обратите внимание на температуру ядер процессора.
Linux предоставляет сведения о частотах через интерфейс /sys. lscpu использует их для обобщения. Но посмотрите на параметры ядра напрямую, если вы подозреваете, что у вас есть проблема, особенно когда система находится под нагрузкой.
find /sys -name freq
Описание ядра по частоте процессора задокументировано здесь. Ядро Linux CPUFREQ