En mi caso, no puedo usar el semáforo (Estoy en git -bash en Windows ), así que se me ocurrió una forma genérica de dividir la tarea entre N trabajadores, antes de que comiencen.
Funciona bien si las tareas toman aproximadamente la misma cantidad de tiempo. La desventaja es que, si uno de los trabajadores tarda mucho en hacer su parte del trabajo, los demás que ya terminaron no ayudarán.
# array of assets, assuming at least 1 item exists
listAssets=( {a..z} ) # example: a b c d.. z
# listAssets=( ~/"path with spaces/"*.txt ) # could be file paths
# replace with your task
task() { # $1 = idWorker, $2 = asset
echo "Worker $1: Asset '$2' START!"
# simulating a task that randomly takes 3-6 seconds
sleep $(( ($RANDOM % 4) + 3 ))
echo " Worker $1: Asset '$2' OK!"
}
nVirtualCores=$(nproc --all)
nWorkers=$(( $nVirtualCores * 1 )) # I want 1 process per core
worker() { # $1 = idWorker
echo "Worker $1 GO!"
idAsset=0
for asset in "${listAssets[@]}"; do
# split assets among workers (using modulo); each worker will go through
# the list and select the asset only if it belongs to that worker
(( idAsset % nWorkers == $1 )) && task $1 "$asset"
(( idAsset++ ))
done
echo " Worker $1 ALL DONE!"
}
for (( idWorker=0; idWorker<nWorkers; idWorker++ )); do
# start workers in parallel, use 1 process for each
worker $idWorker &
done
wait # until all workers are done
Да, вы можете указать tail
начинать без строк из файла, и он будет отображать только строки, добавленные после запуска:
tail -F -n 0 /var/log/syslog
По умолчанию tail
показывает последние десять строк файла (с ), который предлагается обработать.