Я записал немного сценария часов для наблюдения среднего числа загрузки на сервере Linux (только для изучения целей и потому что время работы часов не дает вывод, который я хочу).
Это работает отлично, но иметь среднее число загрузки для каждого Core i делят значения среднего числа загрузки суммой ядер. Это теперь сделано жестким кодированием ядра, но это сосет, если я хочу использовать его на другом сервере.
Из-за этого я хочу сделать ядра переменной как nproc.
Все хорошие и все, но по некоторым причинам когда я использую nproc в качестве базового количества, мой вывод, полностью отличаются затем, когда я трудно кодирую ядра...
Это - мой сценарий теперь:
PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin:/opt/csw/bin:/usr/local/bin:/bin
while true
do
uptime | awk '{ printf "%2.2f ",$(NF-2)/4 ; printf "%2.2f ",$(NF-1)/4 ; printf "%2.2f\n",$(NF)/4}'
sleep 1
done
поскольку Вы видите, что я разделил среднее число загрузки на 4 (4 базовых сервера)
Это дает мне следующий вывод:
$ ./watch-load.sh
1.05 0.96 1.09
1.05 0.96 1.09
0.96 0.94 1.08
0.96 0.94 1.08
0.96 0.94 1.08
но когда я редактирую сценарий для использования nproc, он выглядит примерно так:
#! /bin/bash
PATH=/usr/gnu/bin:/usr/bin:/usr/sbin:/sbin:/opt/csw/bin:/usr/local/bin:/bin
while true
do
uptime | awk '{ printf "%.2f ",$10/$(nproc) ; printf "%2.2f ",$11/$(nproc) ; printf "%2.2f\n",$12/$(nproc)}'
sleep 1
done
Это даст мне следующие результаты:
$ ./watch-load-test.sh
0.22 0.23 0.27
0.22 0.23 0.27
0.22 0.23 0.27
0.28 0.24 0.27
0.28 0.24 0.27
Это странно, потому что nproc показывает 4 ядра:
$ nproc
4
Я в замешательстве здесь... Каким-либо идеям о том, почему это просто разве работает, не нравится он, должен?
В awk, $(nproc)
означает значение nproc
поле th, где nproc
awk переменная. Так как Ваш код awk не определяет такую переменную, он оценивает к $0
$ echo '1 2 3' | awk '{print $(nproc)}'
1 2 3
Если Вы хотите передать значение оболочки, управляют заменой $(nproc)
в Ваш код awk можно сделать настолько использующий -v
синтаксис командной строки
Напр.
$ echo '1 2 3' | awk -v nproc=$(nproc) '{print nproc}'
2