спулер задачи мог бы помочь Вам.
Как в freshmeat.net:
спулер задачи является системой пакета Unix, где задачи буферизовали выполненный один за другим. Количество заданий для выполнения сразу может быть установлено в любое время. У каждого пользователя в каждой системе есть своя собственная очередь заданий. Задачи выполняются в корректном контексте (тот из, ставят в очередь) от любой оболочки/процесса, и за ее выводом/результатами можно легко наблюдать. Очень полезно, когда Вы знаете, что Ваши команды зависят от большого количества RAM, большого дискового использования, дают большой вывод, или по любой причине лучше не выполнить их всех одновременно, в то время как Вы хотите заставить свои ресурсы напряженно трудиться для максимума benfit. Его интерфейс позволяет использовать его легко в сценариях.
Спулер задачи доступен в Debian, Ubuntu и других дистрибутивах.
Это позволяет Вам иметь очередь задач выполнить, и получить доступ к их выводам только в желании.
Например:
$ tsp sleep 5
0
$ tsp sleep 5
1
$ tsp
ID State Output E-Level Times(r/u/s) Command [run=1/1]
2 running /tmp/ts-out.ZWn6Le sleep 5
1 finished /tmp/ts-out.Fhlcle 0 5.00/0.00/0.01 sleep 5
При выполнении большого количества заданий в фоне он определенно поможет Вам.
Можно или выполнить их последовательно или в предварительно установленном объеме слотов. Можно также установить зависимости среди задач (выполните task1 только если task0, завершенный успешно).
Можно вызвать zsh
как неинтерактивная оболочка для отключения уведомлений о задании.
zsh -c '
trap "echo trapped child_done" CHLD
sleep 5 &
#wait
sleep 10 # simulate other running cmds
echo script done
'
Посмотрите следующий пример:
trap 'echo "DONE"' 0
{ find /usr & } &> /dev/null
wait
Это работает хорошо. Никакая потребность ( )
: это делает не нужную подоболочку. { }
просто группируют команды.
[2] 49591
и [2] + 49591 exit 1 find /usr
, когда это не должно печатать ни один из них!
– Tyilo
07.10.2012, 03:28
Это старый вопрос, но возможный ответ (в bash, не проверено в zsh) - использовать управление заданиями в подпрограмме: (command & wait)
Примечание: bash подавляет сообщения о начале/завершении фонового задания в под-оболочке, и нет необходимости в перенаправлении.
Вот как это сделать в обоих {ba,z}sh
.
Использование функции избавляет от необходимости сохранять и восстанавливать состояние переменной zsh
's monitor
с помощью setopt local_options
.
# Run the command given by "$@" in the background
silent_background() {
if [[ -n $ZSH_VERSION ]]; then # zsh: https://superuser.com/a/1285272/365890
setopt local_options no_notify no_monitor
"$@" &
elif [[ -n $BASH_VERSION ]]; then # bash: https://stackoverflow.com/a/27340076/5353461
{ 2>&3 "$@"& } 3>&2 2>/dev/null
else # Unknownness - just background it
"$@" &
fi
}
Используя это следующим образом:
trap 'echo child done' CHLD
silent_background sleep 1
Выдаст ожидаемое сообщение child done
.