Bash: несколько циклов for в фоновом режиме

У меня тоже была проблема с запуском, но просто отключив SELinux, проблема решилась сама собой:

# First check if this is even your problem, is SELinux enabled?
getenforce

# If the above created the output of '1', then this could very
# well be your problem.. keep reading.

# Disable SELinux
setenforce 0

# Restart bluetooth
systemctl restart bluetooth

Вы можете остановиться на этом шаге, если хотите (подключить свое устройство и работать с ним ). Но если вы хотите исправить это на будущее, правильным решением будет внутреннее обновление вашей библиотеки SELinux (, чтобы вы могли повторно -включить ее):

# Create your own module
grep bluetooth /var/log/audit/audit.log | audit2allow -M mybluetooth

# Install it now:
semodule -i mybluetooth.pp

# Now safely re-enable SELinux:
setenforce 1

В моем случае именно такая запись была причиной:

type=AVC msg=audit(1522596590.758:103): avc:  denied  { mounton } for  pid=999 comm="(uetoothd)" path="/var/lib/bluetooth" dev="dm-0" ino=2362849 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:bluetooth_var_lib_t:s0 tclass=dir permissive=0
8
03.10.2019, 10:14
2 ответа

Внешний цикл, который у вас есть, в основном

for i in {1..10}; do
    some_compound_command &
done

Это приведет к запуску десяти одновременных экземпляров some_compound_commandв фоновом режиме. Они будут запущены как можно быстрее, но не совсем "все одновременно" (т.е. если some_compound_commandзаймет очень мало времени, то первый вполне может закончиться раньше, чем начнется последний ).

Тот факт, что some_compound_commandоказывается циклом, не важен. Это означает, что код, который вы показываете, является правильным в том, что итерации внутреннегоj-цикла будут выполняться последовательно, но все экземпляры внутреннего цикла (по одному на итерацию внешнегоi-Цикл )будет запущен одновременно.

Единственное, что нужно иметь в виду, это то, что каждое фоновое задание будет выполняться в подоболочке. Это означает, что изменения, внесенные в среду (, например. изменения значений переменных оболочки, изменения текущего рабочего каталога с помощью cdи т. д. )в одном экземпляре внутреннего цикла не будут видны за пределами этого конкретного фонового задания.

Возможно, вы захотите добавить оператор waitпосле цикла, просто чтобы дождаться фактического завершения всех фоновых заданий, по крайней мере, до завершения скрипта:

for i in {1..10}; do
    for j in {1..10}; do
        run_command "$i" "$j"
    done &
done

wait
8
27.01.2020, 20:11

Если у вас есть GNU Parallel, вы должны:

parallel -j0 'for j in {1..10}; do run_command {} $j; done' ::: {1..10}

Одним из преимуществ является то, что выходные данные при параллельной работе run_commandsне будут смешиваться.

3
27.01.2020, 20:11

Теги

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