Intereting Posts
Включить 2-й монитор (только ТВ) при включении Обновление программного обеспечения Fedora GUI несовместимо с обновлением командной строки dnf Выберите строки в одном файле на основе определенных значений во втором файле Расшифровка ранее созданного устройства losetup Для чего нужны «пользователи» и «другие»? Запуск сценария проекта R с аргументами в AWK в сценарии Bash (Ubuntu Linux) почему /etc/cron.hourly/myjob не работает? Создание автономного установщика Debian CD Можно ли использовать OpenCL на минимальной ОС без X? Как снизить температуру моего Toshiba с помощью Slackware? Найдите позицию, затем произведите изменение с помощью sed Как контролировать целостность скрипта, который работает? Как проверить, обрезаны ли аудиофайлы без воспроизведения файла? Как зашифровать файл в удаленной системе и зашифрованный файл следует сохранить непосредственно в локальной системе скрипт задает вывод команды переменной

Почему bash 4.3 сохраняет выделение памяти в скрипте

Почему этот сценарий оболочки постепенно потребляет больше памяти в bash? Я не использую никаких локальных переменных, и хотя значение cpid изменяется на каждой итерации, потому что ls выходит немедленно, но он никогда не должен слишком увеличиваться.

Сценарий оболочки, о котором идет речь, только контролирует подпроцесс и проверяет, не работает ли он. Этот скрипт называется run-always

 set -euf # monitor a child process # see if it's up cpid= while : ; do # if cpid isn't set, spawn child if [ -z "$cpid" ]; then "$@" & cpid="$!" fi # if child isn't active unset cpid if ps -o pid= -p "$cpid"; then : else cpid= fi sleep 1 done 

Если я использую его с процессом, который выходит немедленно (например, ls ), тогда мы получаем следующее использование памяти, когда я dash run-always ls скрипт с dash run-always ls

4476kb, и он никогда не растет.

Это команда, которую я использую для использования памяти один раз в секунду в Linux … вероятно, есть способ получить память и пиковое использование памяти непосредственно из ps , но это делает работу.

  while : ; do cat /proc/"$(ps a | grep run-always | grep -v grep | awk '{print $1}')"/status | grep -i 'vmsize\|vmpeak' ; sleep 1; done 

Когда я выполняю приведенный выше сценарий с dash , использование памяти никогда не растет, оно парит с постоянной скоростью 4476 КБ на моей машине.

Однако, когда я использую bash ( bash run-always ls ), каждые десять секунд он выделяет еще несколько килобайт памяти и никогда не освобождает его.

Почему это делает bash?

Пример вывода:

 VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16676 kB VmSize: 16676 kB VmPeak: 16680 kB VmSize: 16680 kB VmPeak: 16680 kB VmSize: 16680 kB VmPeak: 16680 kB VmSize: 16680 kB VmPeak: 16680 kB VmSize: 16680 kB VmPeak: 16680 kB VmSize: 16680 kB VmPeak: 16680 kB VmSize: 16680 kB VmPeak: 16680 kB VmSize: 16680 kB VmPeak: 16680 kB VmSize: 16680 kB VmPeak: 16680 kB VmSize: 16680 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16684 kB VmSize: 16684 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16688 kB VmSize: 16688 kB VmPeak: 16692 kB VmSize: 16692 kB 

Поскольку вы уже обнаружили, что эта проблема не появляется с тире, кажется очевидным, что существует высокая вероятность того, что это вызвано ошибкой.

Он также растет, если вы используете bash-3.x, но очень медленно – все же быстрее, чем с другими оболочками.

Я рекомендую вам сделать отчет об ошибке против вашей версии bash.

BTW: Я провел несколько тестов, и есть только две оболочки, в которых нет роста вообще – независимо от того, как долго вы ждете: mksh и оригинальная Bourne Shell которая еще не была конвертирована для использования malloc () вместо sbrk ().

Все остальные раковины растут очень медленно.