LINUX.ORG.RU

Bash: создание списка переменных в зависимости от к-ва ядер ЦП

 ,


2

2

Здравствуйте, ув. программисты и сисадмины. Решение моего вопроса не нашёл абсолютно нигде. Задача: перед выполнением списка команд небходимо предопределить список переменных, в количестве равному к-ву ядер процессора. Цикл здесь не катит, так как нужно запустить одновременно несколько экземпляров процесса с уже готовыми переменными, к-во которых заранее неизвестно и определяется во время выполнения скрипта: VAR=$(nproc) Уверен, что это очень простая задача для программистов, но как её выполнить нигде не написано. Помогите пожалуйста решить такую одновременно простую и сложную задачу.

это что bash? тогда см в сторону make -j

anonymous2 ★★★★★
()

Актуальная информация о процесорах и их количестве доступна в /proc/cpuinfo например. Можно ещё выхлоп lscpu посмотреть.

Stanson ★★★★★
()

Если bash достаточно свежий, в нём должен быть coproc. Конечно, присвоение stdout в VAR в этом случае будет не так тривиально, но возможно.

JaM
()

ничего не понятно. что за список переменных, и как он зависит от количества ядер?
может, надо просто

case "$VAR" in

    4)
        тут создаём один список переменных
    ;;

    2)
        тут создаём другой список переменных

esac

?

teod0r ★★★★★
()

Задача: перед выполнением списка команд небходимо предопределить список переменных, в количестве равному к-ву ядер процессора.

Это не задача, а твои фантазии на тему решения задачи.
Про саму задачу ты не сказал ни слова

zolden ★★★★★
()

Цикл здесь не катит

почему?

for i in $(seq `nproc`); do 
    export VAR=$i
    (
        my_command1
        my_command2
        ...
    ) &
done
anonymous
()
Ответ на: комментарий от teod0r

От количества ядер зависит количество запускаемых процессов osd_cat и набор переменных каждого процесса (Core1, Core2, Core$N) для вывода на экран загруженности каждого ядра. Про такой способ уже думал, но не подходит, нужна автоматическая генерация переменных, так как к-во ядер может быть какое угодно :)

Wehrmacht_Rover
() автор топика
Ответ на: комментарий от ananas

Всё получилось!

Спасибо большое за подсказку! То что надо, теперь скрипт работает как часы! Видно загрузку каждого ядра в оверлэе :) А что за вариант с массивом?

Wehrmacht_Rover
() автор топика
Последнее исправление: Wehrmacht_Rover (всего исправлений: 1)
Ответ на: Всё получилось! от Wehrmacht_Rover

eval VAR$i="value$i"

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

eval VAR$i='"value$i"'

teod0r ★★★★★
()
Ответ на: Всё получилось! от Wehrmacht_Rover

А что за вариант с массивом?

declare -A VARS
for i in $(seq $(nproc)); do
    VARS[$i]="value$i"
done
ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.