Причина, по которой ваш пример не будет работать, заключается в том, что команда background выполняется в среде subshell, поэтому значение $nfiles
будет недоступно (т.е. в коде вашего примера оно потеряно).
Одним из простых способов обойти эту проблему является использование временного файла. В обобщенном примере кода ниже я заменил конвейеры rsync
на более простые команды, которые sleep
и echo произвольное число:
# use existing value of TMPDIR if exists, else set it to /tmp
: ${TMPDIR:=/tmp}
# ensure temporary file will be deleted on interrupt or error:
trap "rm -f $TMPDIR/nfiles.$$; exit 1" 1 2 3 15
# run the first command in background and save output to a temporary file:
(sleep 3; echo 1) > $TMPDIR/nfiles.$$ &
nfiles2=$(sleep 1; echo 2)
# wait for background command to complete:
wait
# save temporary file data in variables:
nfiles=$(cat $TMPDIR/nfiles.$$)
# remove the temp files on normal exit:
rm -f $TMPDIR/nfiles.$$
# $nfiles and $nfiles 2 should now contain the desired data
echo nfiles=$nfiles
echo nfiles2=$nfiles2
cat /sys/devices/cpu/caps/pmu_name
haswell
Попытка исправить скрипт, опубликованный ранее @Tyilo. Обновленная версия ниже.
#!/bin/bash
set -euo pipefail
if [[ $# == 0 ]]; then
modelname=$(cat /proc/cpuinfo | grep 'model name' | head -1)
if ! grep Intel <<<"$modelname" > /dev/null; then
echo "You don't seem to have an Intel processor" >&2
exit 1
fi
name=$(sed 's/.*CPU\s\(.*\)\s\(@\).*/\1/' <<<"$modelname")
echo "Processor name: $name" >&2
name=${name// /'%20'}
else
name=$1
fi
links=($(curl --silent "https://ark.intel.com/content/www/us/en/ark/search.html?_charset_=UTF-8&q=$name" | pup '#FormRedirectUrl attr{value}'))
results=${#links[@]}
if [[ $results == 0 ]]; then
echo "No results found" >&2
exit 1
fi
link=${links[0]}
if [[ $results != 1 ]]; then
echo "Warning: $results results found" >&2
echo "Using: $link" >&2
fi
url="https://ark.intel.com$link"
codename=$(curl --silent "$url" | pup 'span[data-key="CodeNameText"] text{}' | xargs | sed 's/Products formerly //')
echo "$codename"
Запуская обновленный скрипт на моем сервере, я получаю следующий результат:
$./intel_codename
Processor name: E3-1225 v5
Skylake
Совсем не эксперт. Только что научился использовать curl и pup за последний час или около того. Не тестировал его на других, кроме моей собственной машины.
Обновление:Сделал еще несколько тестов. Скрипт должен работать для семейства процессоров Xeon . Однако он ломается (, показывая, что результаты не найдены ), если запрос базы данных Intel Ark возвращает несколько результатов. Например, для Xeon Platinum 8260 он вернет 8260 и все его варианты, такие как 8260M. Кроме того, если имя (номер процессора )используется в других продуктах или ключевых полях данных, из запроса будет возвращено несколько результатов, и сценарий не найдет результат. Он также ломается для тех процессоров версии 0, таких как Xeon E5 -2690 0.
Для семейства процессоров Intel Core (i7, i5 и т. д. )необходимо заменить команду sed на исходную от @Tyilo, см. ниже.
name=$(sed 's/.*\s\(\S*\) CPU.*/\1/' <<<"$modelname")
Опять же, если запрос возвращает несколько результатов. Этот простой скрипт не сможет правильно выполнить синтаксический анализ и выдаст результат «Результаты не найдены».
В облаке ни один из приведенных выше ответов мне не подходит. У меня есть название модели «Intel (R )Xeon (R )ЦП @ 2,00 ГГц», dmidecode сообщает мне, что Google сделал процессоры и так далее.
/proc/cpuinfo "семейство процессоров" и "модель" немного помогают. Они уникальны почти для всех комбинаций и их можно найти наhttps://en.wikichip.org/wiki/intel/cpuid. Однако семейство 6 модели 85 - это и скайлейк, и каскадное озеро.
Сейчас я работаю в сфере серверов. Мой скрипт работает как минимум на более свежих серверах. Различать серверы Skylake и Cascade Lake не очень приятно... он использует поле «имя модели» /proc/cpuinfo, чтобы отличить Skylake от Cascade Lake.
#!/bin/bash
# cascade lake 2nd gen stuff from https://www.intel.com/content/www/us/en/products/docs/processors/xeon/2nd-gen-xeon-scalable-spec-update.html
# 2nd gen xeon scalable cpus: cascade lake sku is 82xx, 62xx, 52xx, 42xx 32xx W-32xx from https://www.intel.com/content/www/us/en/products/docs/processors/xeon/2nd-gen-xeon-scalable-spec-update.html
# skylake 1st gen stuff from https://www.intel.com/content/www/us/en/processors/xeon/scalable/xeon-scalable-spec-update.html
# 1st gen xeon scalable cpus: 81xx, 61xx, 51xx, 81xxT, 61xxT 81xxF, 61xxF, 51xx, 41xx, 31xx, 51xxT 41xxT, 51xx7,
CPU_NAME=`cat /proc/cpuinfo | awk '
function decode_fam_mod(vndor, fam, mod, mod_nm) {
if (vndor == "GenuineIntel") {
# cpuid tables from https://en.wikichip.org/wiki/intel/cpuid
dcd[1,1]="Ice Lake"; dcd[1,2] ="Family 6 Model 108";
dcd[2,1]="Ice Lake"; dcd[2,2] ="Family 6 Model 106";
dcd[3,1]="Cascade Lake/Skylake"; dcd[3,2] ="Family 6 Model 85"; # 06_55h Intel always does the hex fam_model
dcd[4,1]="Broadwell"; dcd[4,2] ="Family 6 Model 79"; # 06_4fh
dcd[5,1]="Broadwell"; dcd[5,2] ="Family 6 Model 86"; # 06_56h
dcd[6,1]="Haswell"; dcd[6,2] ="Family 6 Model 63"; # 06_3fh
dcd[7,1]="Ivy Bridge"; dcd[7,2] ="Family 6 Model 62";
dcd[8,1]="Sandy Bridge"; dcd[8,2] ="Family 6 Model 45"; # 06_2dh
dcd[9,1]="Westmere"; dcd[9,2] ="Family 6 Model 44";
dcd[10,1]="EX"; dcd[10,2]="Family 6 Model 47";
dcd[11,1]="Nehalem"; dcd[11,2]="Family 6 Model 46";
dcd[12,1]="Lynnfield"; dcd[12,2]="Family 6 Model 30";
dcd[13,1]="Bloomfield, EP, WS"; dcd[13,2]="Family 6 Model 26";
dcd[14,1]="Penryn"; dcd[14,2]="Family 6 Model 29";
dcd[15,1]="Harpertown, QC, Wolfdale, Yorkfield"; dcd[15,2]="Family 6 Model 23";
str = "Family " fam " Model " mod;
#printf("str= %s\n", str);
res=" ";
for(k=1;k <=15;k++) { if (dcd[k,2] == str) {res=dcd[k,1];break;}}
if (k == 3) {
# so Cooper Lake/Cascade Lake/SkyLake)
if (match(mod_nm, / [86543]2[0-9][0-9]/) > 0) { res="Cascade Lake";} else
if (match(mod_nm, / [86543]1[0-9][0-9]/) > 0) { res="Skylake";}
}
return res;
}
}
/^vendor_id/ {
vndr=$(NF);
}
/^cpu family/ {
fam=$(NF);
}
/^model/ {
if ($2 == ":") {
mod=$(NF);
}
}
/^model name/ {
#model name : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
n=split($0, arr, ":");
mod_nm = arr[2];
#printf("vndr= %s, fam= %s, mod= %s, mod_nm= %s\n", vndr, fam, mod, mod_nm);
cpu_name=decode_fam_mod(vndr, fam, mod, mod_nm);
printf("%s\n", cpu_name);
exit;
}
'`
echo "cpu uarch= $CPU_NAME"
Это не касается клиентского процессора... но должно быть относительно просто взять информацию о клиентском процессоре из WikiChip и расширить список.