Тихо запустите задачу в фоне

  • libid3tag
  • taglib
  • Я использовал их для крошечной программы, которую я однажды записал. Было довольно просто в использовании.

12
07.10.2012, 03:04
5 ответов

спулер задачи мог бы помочь Вам.

Как в 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, завершенный успешно).

5
27.01.2020, 19:56

Можно вызвать zsh как неинтерактивная оболочка для отключения уведомлений о задании.

zsh -c '
   trap "echo trapped child_done" CHLD
   sleep 5 &
   #wait
   sleep 10 # simulate other running cmds
   echo script done
'
1
27.01.2020, 19:56

Посмотрите следующий пример:

trap 'echo "DONE"' 0
{ find /usr & } &> /dev/null
wait

Это работает хорошо. Никакая потребность ( ) : это делает не нужную подоболочку. { } просто группируют команды.

0
27.01.2020, 19:56
  • 1
    Это печатает [2] 49591 и [2] + 49591 exit 1 find /usr, когда это не должно печатать ни один из них! –  Tyilo 07.10.2012, 03:28
  • 2
    Извините, неправильно понятый Ваш вопрос так. –  Gilles Quenot 07.10.2012, 03:46

Это старый вопрос, но возможный ответ (в bash, не проверено в zsh) - использовать управление заданиями в подпрограмме: (command & wait)

Примечание: bash подавляет сообщения о начале/завершении фонового задания в под-оболочке, и нет необходимости в перенаправлении.

0
27.01.2020, 19:56

Вот как это сделать в обоих {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.

5
27.01.2020, 19:56

Теги

Похожие вопросы