Это проще, чем кажется:
#!/bin/sh
yourfunctiona(){ ...; }
...
yourfunctionz(){ ...; }
. /path/to/file/with/more/functions
while read COMMANDS; do
eval "$COMMANDS"
done
вы можете использовать read -p, если вам нужна подсказка, или -t, если вы хотите, чтобы тайм-аут ... или, если вы хотите, вы могли бы даже использовать свойлюбимая диалоговая программа вместо чтения и передача вывода в оконный ящик
touch /tmp/mycmdline
Xdialog --tailbox /tmp/mycmdline 0 0 &
COMMANDS="echo "
while ([ "$COMMANDS" != "" ]); do
COMMANDS=`Xdialog --stdout --inputbox "Text here" 0 0`
eval "$COMMANDS"
done >>/tmp/mycmdline &
Для выполнения команд в потоках вместо eval можно использовать следующее: $ COMMANDS
#this will need to be before the loope
NUMCORES=$(awk '/cpu cores/{sum += $4}END{print sum}' /proc/cpuinfo)
for i in {1..$NUMCORES};do
if [ $i -eq $NUMCORES ] && #see comments below
if [ -d /proc/$threadarray[$i] ]; then #this core already has a thread
#note: each process gets a directory named /proc/<its_pid> - hacky, but works
continue
else #this core is free
$COMMAND &
threadarray[$i]=$!
break
fi
done
Тогдаэто тот случай, когда вы заполняете все темы.Вы можете либо поместить все это в цикл while и добавить продолжения и разрывы, либо выбрать ядро для ожидания (вероятно, последнего) и ожидания его
для ожидания завершения использования одного потока.:
wait $threadarray[$i]
для ожидания завершения использования всех потоков:
wait
#I ended up using this to keep my load from getting to high for too long
еще одно примечание: вы можете обнаружить, что некоторые команды не любят многопоточность, если вы можете поместитьвсе это в заявлении кейса
Я постараюсь в ближайшее время сделать некоторую очистку, чтобы собрать все маленькие блоки вместе (извините, я собираю это воедино из случайных заметок, которые я использовал для реализации этоготочная вещь, но не могу найти)