Практическое написание сценариев командной оболочки Bash/Код-сниппеты: различия между версиями

Перейти к навигации Перейти к поиску
 
;Примеры
<source lang=bash>
#!/bin/bash
source "swarm.bash" # Подключаем библиотеку
 
trap 'thr_kill_swarm' EXIT SIGKILL # Чтобы гарантированно уничтожить стаю
 
# Команда для тестирования. Печатает символ на экране ($2) некоторое количество раз, указанное в аргументе $1.
long_process_imitation() {
[[ $# -ge 2 ]] || return 1
local counter=$1
local floor=1
local range=9
local number
while ((counter-- > 0)); do
while [[ $number -le $floor ]]; do
number=$RANDOM
: $((number %= $range))
done
sleep 0.$number
printf "$2 "
done
return 0
}
 
# Выпускаем стаю
for symbol in {1..4}; do
thr_add_to_swarm 'long_process_imitation' 3 "$symbol"
done
# Ждем, когда все процессы в стае завершатся.
thr_join_to_swarm
echo
 
# Пример вывода
# 1 3 4 2 1 1 3 4 2 3 4 2
</source>
В этом примере мы запускаем 4 процесса, каждый из которых печатает цифру, которую ему передали. Каждый процесс печатает цифру три раза со случайной паузой между выводом. Вы можете видеть, что цифры выводятся в разнобой, потому что процессы реально конкурируют за процессорное время. Когда все процессы в стае завершаются, функция <code>thr_join_to_swarm</code> возвращает управление.
 
Теперь усложним пример и попробуем использование перехвата событий.
<source lang=bash>
#!/bin/bash
source "swarm.bash" # Подключаем библиотеку
 
trap 'thr_kill_swarm' EXIT SIGKILL # Чтобы гарантированно уничтожить стаю
 
_THR_ENABLE_PROMISES=1 # Включаем механизм с файлами обещаний
 
# Обработка события получения статуса от участника стаи
__thr_join_to_swarm_event() {
case "$2" in
tick)
echo "EVENT: Tick from $1"
;;
stop)
echo "EVENT: Stop from $1 with code $(thr_get_return_code "$1")"
;;
esac
}
 
# Сообщение выводится каждый раз после очередного опроса
__thr_join_to_swarm_after_after() {
echo "INFO: After pooling: Swarm Array = ${__THR_SPAWNED_SWARM[*]}"
}
 
# Сообщение выводится перед очередным опросом
__thr_join_to_swarm_before_before() {
echo "INFO: Before pooling: Swarm Array = ${__THR_SPAWNED_SWARM[*]}"
}
 
# Сообщение выводится перед входом в цикл опроса
__thr_join_to_swarm_before() {
echo "INFO: Pool manager started"
}
 
# Сообщение выводится после выхода из цикла опроса
__thr_join_to_swarm_after() {
echo "INFO: Pool manager ended"
}
 
# Имитация долгого процесса
long_process_imitation() {
[[ $# -ne 0 ]] || return 1
sleep $1
return $1
}
 
# Выпускаем стаю
for symbol in 3 5 3 1; do
thr_add_to_swarm 'long_process_imitation' $symbol
done
# Ждем, когда все процессы в стае завершатся.
thr_join_to_swarm
</source>
Пример вывода
<source lang=bash>
INFO: Pool manager started
INFO: Before pooling: Swarm Array = 32497 32498 32500 32502
EVENT: Tick from 32497
EVENT: Tick from 32498
EVENT: Tick from 32500
EVENT: Tick from 32502
INFO: After pooling: Swarm Array = 32497 32498 32500 32502
INFO: Before pooling: Swarm Array = 32497 32498 32500 32502
EVENT: Tick from 32497
EVENT: Tick from 32498
EVENT: Tick from 32500
EVENT: Tick from 32502
INFO: After pooling: Swarm Array = 32497 32498 32500 32502
INFO: Before pooling: Swarm Array = 32497 32498 32500 32502
EVENT: Tick from 32497
EVENT: Tick from 32498
EVENT: Tick from 32500
EVENT: Stop from 32502 with code 1
INFO: After pooling: Swarm Array = 32497 32498 32500
INFO: Before pooling: Swarm Array = 32497 32498 32500
EVENT: Tick from 32497
EVENT: Tick from 32498
EVENT: Tick from 32500
INFO: After pooling: Swarm Array = 32497 32498 32500
INFO: Before pooling: Swarm Array = 32497 32498 32500
EVENT: Stop from 32497 with code 3
EVENT: Tick from 32498
EVENT: Stop from 32500 with code 3
INFO: After pooling: Swarm Array = 32498
INFO: Before pooling: Swarm Array = 32498
EVENT: Tick from 32498
INFO: After pooling: Swarm Array = 32498
INFO: Before pooling: Swarm Array = 32498
EVENT: Tick from 32498
INFO: After pooling: Swarm Array = 32498
INFO: Before pooling: Swarm Array = 32498
EVENT: Stop from 32498 with code 5
INFO: After pooling: Swarm Array = 32498
INFO: Before pooling: Swarm Array = 32498
INFO: Pool manager ended
</source>
 
== Рисование на терминале ==
1045

правок

Навигация