mkdir -p и touch для создания ряда подкаталогов и файлов -- Как это работает?

Это сделает это (примерно за 40 секунд в моей системе):

#!/bin/bash
[ "$BASHPID" = "$$" ] || { echo "Must run in a new process group"; exit 1; }>&2
cnt0() { cnt0=$#; }
cnt1() { cnt1=$#; }

tmpd=
trap 'rm -rf "$tmpd"; exit 1' INT HUP QUIT EXIT
tmpd=$(mktemp -d)
mkfifo "$tmpd/fifo"
exec 4<>"$tmpd/fifo"
rm -rf "$tmpd"
trap - INT HUP QUIT EXIT


open_all()
{ 
    cnt0 /proc/self/fd/*; 
    while exec {fd}</dev/null; do :; done; 
    cnt1 /proc/self/fd/*;
    nopened=$((cnt1-cnt0));
    echo $nopened >&4;
    cat /proc/sys/fs/file-nr
    if ((nopened)); then
        sleep 10000000
    fi
}

( open_all )&
while :; do
    if read nopened <&4 && ((nopened)); then
        ( open_all )&
        continue
    fi
    break
done
kill -TERM -$$

Он работает, открывая /dev/nullв подоболочке столько раз, сколько возможно (он должен работать примерно 1000 -4000 раз в зависимости от вашегоulimit -n). Если хотя бы один файловый дескриптор был открыт, родитель уведомляется через конвейер, а подоболочка приостанавливается с помощью sleep. Родительский процесс отвечает на успешное выделение fd -в дочернем процессе, продолжая процесс в другой подоболочке до тех пор, пока одна из подоболочек не выйдет из строя.

/proc/sys/fs/file-nrвызывается catна каждой итерации, чтобы вы знали, как продолжается процесс.

В конце процесса вы должны получить что-то вроде:

...
778192  0       786806
779248  0       786806
780272  0       786806
781264  0       786806
782256  0       786806
783280  0       786806
784304  0       786806
785328  0       786806
786352  0       786806
./open_all: line 35: cannot redirect standard input from /dev/null: Too many open files in system
./open_all: line 18: fd: Too many open files in system
Terminated

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

0
14.08.2019, 23:08
2 ответа

Что ж, посмотрим:

1 )командаmkdir -p playground/dir-{00{1..9},0{10..99},100}

Вы просто создаете 100 каталогов в playground/, каждый из них в следующем формате :dir-xxx, где xxx— цифры. По {00{1..9},0{10..99},100}вы говорите 3 вещи:

  1. создать каталоги 00x, где xот 1 до 9, это 00{1..9}часть его
  2. создать каталоги 0xx, где xxот 10 до 99, это0{10..99}
  3. его часть создает каталог 100

2 )когда у вас есть все каталоги из 1 ), то вы запускаете команду touch

Вы просто касаетесь файлов в следующем формате file-x, где x— один символ из диапазона A -Z. Этой частью {00{1..9},0{10..99},100}вы просто говорите, что хотите коснуться файлов в те каталоги, созданные в 1 ). Как видите, часть в фигурных скобках такая же, как и в команде mkdir.

Надеюсь, это поможет. Если вы хотите узнать немного больше о расширении скобок, вы можете прочитать, например, это:https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html

2
28.01.2020, 02:29

См. «Расширение фигурных скобок» на справочной странице bash.

Supplied integers may be prefixed with ‘0’ to force each term to have the same width.

https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html

0
28.01.2020, 02:29

Теги

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