Прошел поиск в Интернете, нашел простые «учебные пособия» для использования именованных каналов. Однако, когда я делаю что-либо с фоновыми заданиями, я, кажется, теряю много данных.Использование именованных каналов с bash - Проблема с потерей данных
[[Изменить]: найдено гораздо более простое решение, см. Ответ на сообщение. Итак, вопрос, который я задал, теперь академичен - в случае, если вам может понадобиться сервер задания]]
Использование Ubuntu 10.04 с Linux 2.6.32-25-generiC# 45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux
GNU bash, версия 4.1.5 (1) -release (x86_64-pc-linux-gnu).
Моя функция Баш:
function jqs
{
pipe=/tmp/__job_control_manager__
trap "rm -f $pipe; exit" EXIT SIGKILL
if [[ ! -p "$pipe" ]]; then
mkfifo "$pipe"
fi
while true
do
if read txt <"$pipe"
then
echo "$(date +'%Y'): new text is [[$txt]]"
if [[ "$txt" == 'quit' ]]
then
break
fi
fi
done
}
я запускаю это в фоновом режиме:
> jqs&
[1] 5336
И теперь я кормлю его:
for i in 1 2 3 4 5 6 7 8
do
(echo aaa$i > /tmp/__job_control_manager__ && echo success$i &)
done
Выход противоречива. Я часто не получаю отклика на успех. Я получаю как можно больше новых текстовых эхо, так как успех эха, а иногда и меньше.
Если я удаляю '&' из 'feed', это, похоже, сработает, но я заблокирован до тех пор, пока не будет прочитан вывод. Следовательно, я хочу, чтобы субпроцессы блокировались, но не основной процесс.
Цель состоит в том, чтобы написать простой сценарий управления заданиями, чтобы я мог запускать, скажем, 10 заданий в большинстве случаев и очереди остальных для последующей обработки, но надежно знают, что они выполняются.
Полный менеджер Работа ниже:
function jq_manage
{
export __gn__="$1"
pipe=/tmp/__job_control_manager_"$__gn__"__
trap "rm -f $pipe" EXIT
trap "break" SIGKILL
if [[ ! -p "$pipe" ]]; then
mkfifo "$pipe"
fi
while true
do
date
jobs
if (($(jobs | egrep "Running.*echo '%#_Group_#%_$__gn__'" | wc -l) < $__jN__))
then
echo "Waiting for new job"
if read new_job <"$pipe"
then
echo "new job is [[$new_job]]"
if [[ "$new_job" == 'quit' ]]
then
break
fi
echo "In group $__gn__, starting job $new_job"
eval "(echo '%#_Group_#%_$__gn__' > /dev/null; $new_job) &"
fi
else
sleep 3
fi
done
}
function jq
{
# __gn__ = first parameter to this function, the job group name (the pool within which to allocate __jN__ jobs)
# __jN__ = second parameter to this function, the maximum of job numbers to run concurrently
export __gn__="$1"
shift
export __jN__="$1"
shift
export __jq__=$(jobs | egrep "Running.*echo '%#_GroupQueue_#%_$__gn__'" | wc -l)
if (($__jq__ '<' 1))
then
eval "(echo '%#_GroupQueue_#%_$__gn__' > /dev/null; jq_manage $__gn__) &"
fi
pipe=/tmp/__job_control_manager_"$__gn__"__
echo [email protected] >$pipe
}
Вызов
jq <name> <max processes> <command>
jq abc 2 sleep 20
начнет один процесс. Эта часть работает нормально. Начните второй, отлично. Один за другим, кажется, работает нормально. Но запуск 10 в цикле, похоже, потерял систему, как в более простом примере выше.
Любые подсказки относительно того, что я могу сделать для решения этой очевидной потери данных МПК, будут весьма признательны.
С уважением, Alain.
Посмотрите на [second 2018 Edit to * Как установить переменную на выход из команды *] (https://stackoverflow.com/a/41236640/1765658) или на [GitHub.com: Connector- Баш] (https://github.com/F-Hauri/Connector-bash). Где я * подключаю * подпроцесс hoding * tools * к текущему сеансу оболочки. – 2018-02-12 15:59:24