Где и когда возвращаются статусы выхода для фоновых заданий в bash?

В ядре Linux нет никакого понятия потока, поскольку Linux реализует все потоки как стандартные процессы.

Ядро Linux не обеспечивает специальной семантики планирования или структур данных для представления потоков.

Вместо этого поток является просто процессом, который совместно использует определенные ресурсы с другими процессами. Каждый поток имеет уникальный task_struct и появляется к ядру как нормальный процесс — потоки просто, оказывается, совместно используют ресурсы, такие как адресное пространство, с другими процессами.

К Linux потоки являются просто способом совместного использования ресурсов между процессами. Например, предположите, что у Вас есть процесс, который состоит из четырех потоков. В Linux существует просто четыре процесса и таким образом четыре нормальных task_struct структуры. Четыре процесса настраиваются для совместного использования определенных ресурсов.

И насколько потоки ядра (которые существуют только в kernelspace) затронуты, единственная разница между потоками ядра и нормальными процессами/потоками - то, что потоки ядра не имеют адресного пространства. Они работают только в пространстве ядра и не делают переключателя контекста в пространство пользователя.

3
22.10.2015, 22:59
1 ответ

Bash не позволяет вам фиксировать вывод чего-либо в фоновом режиме.

$ unset var; var=$(sh -c 'sleep 5; echo foo; exit 42') 
$ echo $? $var 
42 foo
$ unset var; var=$(sh -c 'sleep 5; echo foo; exit 42') & wait
[1] 30250
[1]+  Exit 42                 var=$(sh -c 'sleep 5; echo foo; exit 42')
$ echo $? $var 
0 

Существует wait -n , который возвращается, когда какой-то фоновый процесс завершился, и завершается со статусом завершения этого процесса. Поскольку вы знаете, сколько у вас фоновых процессов, вы можете ждать -n столько раз. Уродливо, но ...

while true
do
  curl someurl1 > file1 &
  curl someurl2 > file2 &
  curl someurl3 > file3 &
  for i in 1 2 3; do
    wait -n || { echo some curl failed; continue 2; }
  done

  dosomething "$(< file1)" &
  dosomething "$(< file2)" &
  dosomething "$(< file3)" &
  for i in 1 2 3; do
    wait -n || { echo some dosomething failed; continue 2; }
  done

  break
done
2
27.01.2020, 21:27

Теги

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