Why does bash 4.3 keep allocating memory in a script
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
Why does this shell script gradually consume more memory in bash? I’m not using any local variables. Although the value of cpid
is changing at every iteration because ls
exits immediately, it should never grow too large.
The shell script in question just monitors a subprocess and checks if it’s up. This script is named 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
If I use it with a process that exits immediately (like ls
) then we get the following memory usage when I execute the script with dash run-always ls
4476kb and it never grows.
This is the command I’m using to get the memory usage once per second on Linux … there’s probably a way to get the memory and peak memory usage directly from ps
, but this does the job.
while : ; do cat /proc/"$(ps a | grep run-always | grep -v grep | awk 'print $1')"/status | grep -i 'vmsize|vmpeak' ; sleep 1; done
When I execute the above script with dash
, the memory usage never grows, it hovers at a constant 4476kb on my machine.
However, when I use bash (bash run-always ls
), every ten seconds or so it allocates another few kilobytes of memory and never frees it.
Why is bash doing this?
Example output:
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 dash memory-leaks
add a comment |
Why does this shell script gradually consume more memory in bash? I’m not using any local variables. Although the value of cpid
is changing at every iteration because ls
exits immediately, it should never grow too large.
The shell script in question just monitors a subprocess and checks if it’s up. This script is named 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
If I use it with a process that exits immediately (like ls
) then we get the following memory usage when I execute the script with dash run-always ls
4476kb and it never grows.
This is the command I’m using to get the memory usage once per second on Linux … there’s probably a way to get the memory and peak memory usage directly from ps
, but this does the job.
while : ; do cat /proc/"$(ps a | grep run-always | grep -v grep | awk 'print $1')"/status | grep -i 'vmsize|vmpeak' ; sleep 1; done
When I execute the above script with dash
, the memory usage never grows, it hovers at a constant 4476kb on my machine.
However, when I use bash (bash run-always ls
), every ten seconds or so it allocates another few kilobytes of memory and never frees it.
Why is bash doing this?
Example output:
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 dash memory-leaks
1
This is unrelated to your problem, but what you are doing in this script could probably be done better with thewait
command - or in a case this simple, just not backgrounding the process at all.
– Score_Under
Jul 29 '16 at 14:28
add a comment |
Why does this shell script gradually consume more memory in bash? I’m not using any local variables. Although the value of cpid
is changing at every iteration because ls
exits immediately, it should never grow too large.
The shell script in question just monitors a subprocess and checks if it’s up. This script is named 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
If I use it with a process that exits immediately (like ls
) then we get the following memory usage when I execute the script with dash run-always ls
4476kb and it never grows.
This is the command I’m using to get the memory usage once per second on Linux … there’s probably a way to get the memory and peak memory usage directly from ps
, but this does the job.
while : ; do cat /proc/"$(ps a | grep run-always | grep -v grep | awk 'print $1')"/status | grep -i 'vmsize|vmpeak' ; sleep 1; done
When I execute the above script with dash
, the memory usage never grows, it hovers at a constant 4476kb on my machine.
However, when I use bash (bash run-always ls
), every ten seconds or so it allocates another few kilobytes of memory and never frees it.
Why is bash doing this?
Example output:
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 dash memory-leaks
Why does this shell script gradually consume more memory in bash? I’m not using any local variables. Although the value of cpid
is changing at every iteration because ls
exits immediately, it should never grow too large.
The shell script in question just monitors a subprocess and checks if it’s up. This script is named 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
If I use it with a process that exits immediately (like ls
) then we get the following memory usage when I execute the script with dash run-always ls
4476kb and it never grows.
This is the command I’m using to get the memory usage once per second on Linux … there’s probably a way to get the memory and peak memory usage directly from ps
, but this does the job.
while : ; do cat /proc/"$(ps a | grep run-always | grep -v grep | awk 'print $1')"/status | grep -i 'vmsize|vmpeak' ; sleep 1; done
When I execute the above script with dash
, the memory usage never grows, it hovers at a constant 4476kb on my machine.
However, when I use bash (bash run-always ls
), every ten seconds or so it allocates another few kilobytes of memory and never frees it.
Why is bash doing this?
Example output:
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 dash memory-leaks
bash dash memory-leaks
edited Mar 13 at 7:25
Gregory Nisbet
asked Apr 21 '16 at 21:13
Gregory NisbetGregory Nisbet
1,4981021
1,4981021
1
This is unrelated to your problem, but what you are doing in this script could probably be done better with thewait
command - or in a case this simple, just not backgrounding the process at all.
– Score_Under
Jul 29 '16 at 14:28
add a comment |
1
This is unrelated to your problem, but what you are doing in this script could probably be done better with thewait
command - or in a case this simple, just not backgrounding the process at all.
– Score_Under
Jul 29 '16 at 14:28
1
1
This is unrelated to your problem, but what you are doing in this script could probably be done better with the
wait
command - or in a case this simple, just not backgrounding the process at all.– Score_Under
Jul 29 '16 at 14:28
This is unrelated to your problem, but what you are doing in this script could probably be done better with the
wait
command - or in a case this simple, just not backgrounding the process at all.– Score_Under
Jul 29 '16 at 14:28
add a comment |
2 Answers
2
active
oldest
votes
Bash saves each backgrounded process in a table of active jobs. Because you're spawning new jobs without explicitly checking the old ones, the table potentially increases without bound. The problem goes away if you disown
the process after backgrounding it or check the exit status using jobs
before launching the next background process.
For example, this version of your script does not increase in memory usage:
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
"$@" &
disown $! # Don't waste memory on this red-headed child
cpid="$!"
fi
# if child isn't active unset cpid
if ps -o pid= -p "$cpid"; then
:
else
cpid=
fi
sleep 1
done
add a comment |
As you already discovered that this problem does not appear with dash, it seems to be obvious that there is a high probability that this is caused by a bug.
It does also grow if you are using bash-3.x but very slowly - still faster than with other shells.
I recommend you to make a bug-report against your version of bash.
BTW: I did some tests and there are only two shells where there is no growth at all - regardless how long you wait: mksh
and the original Bourne Shell
that was not yet converted to use malloc() instead of sbrk().
All other shells grow very slowly.
Did you also check the behavior of dash? I ran that script for half an hour and it never allocated more memory.
– Gregory Nisbet
Apr 22 '16 at 2:52
Dash is slowly growing like ksh88 and ksh93. I removed the sleep and waited for some minutes.
– schily
Apr 22 '16 at 7:28
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f278214%2fwhy-does-bash-4-3-keep-allocating-memory-in-a-script%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Bash saves each backgrounded process in a table of active jobs. Because you're spawning new jobs without explicitly checking the old ones, the table potentially increases without bound. The problem goes away if you disown
the process after backgrounding it or check the exit status using jobs
before launching the next background process.
For example, this version of your script does not increase in memory usage:
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
"$@" &
disown $! # Don't waste memory on this red-headed child
cpid="$!"
fi
# if child isn't active unset cpid
if ps -o pid= -p "$cpid"; then
:
else
cpid=
fi
sleep 1
done
add a comment |
Bash saves each backgrounded process in a table of active jobs. Because you're spawning new jobs without explicitly checking the old ones, the table potentially increases without bound. The problem goes away if you disown
the process after backgrounding it or check the exit status using jobs
before launching the next background process.
For example, this version of your script does not increase in memory usage:
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
"$@" &
disown $! # Don't waste memory on this red-headed child
cpid="$!"
fi
# if child isn't active unset cpid
if ps -o pid= -p "$cpid"; then
:
else
cpid=
fi
sleep 1
done
add a comment |
Bash saves each backgrounded process in a table of active jobs. Because you're spawning new jobs without explicitly checking the old ones, the table potentially increases without bound. The problem goes away if you disown
the process after backgrounding it or check the exit status using jobs
before launching the next background process.
For example, this version of your script does not increase in memory usage:
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
"$@" &
disown $! # Don't waste memory on this red-headed child
cpid="$!"
fi
# if child isn't active unset cpid
if ps -o pid= -p "$cpid"; then
:
else
cpid=
fi
sleep 1
done
Bash saves each backgrounded process in a table of active jobs. Because you're spawning new jobs without explicitly checking the old ones, the table potentially increases without bound. The problem goes away if you disown
the process after backgrounding it or check the exit status using jobs
before launching the next background process.
For example, this version of your script does not increase in memory usage:
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
"$@" &
disown $! # Don't waste memory on this red-headed child
cpid="$!"
fi
# if child isn't active unset cpid
if ps -o pid= -p "$cpid"; then
:
else
cpid=
fi
sleep 1
done
answered Dec 28 '17 at 18:47
hackerb9hackerb9
490310
490310
add a comment |
add a comment |
As you already discovered that this problem does not appear with dash, it seems to be obvious that there is a high probability that this is caused by a bug.
It does also grow if you are using bash-3.x but very slowly - still faster than with other shells.
I recommend you to make a bug-report against your version of bash.
BTW: I did some tests and there are only two shells where there is no growth at all - regardless how long you wait: mksh
and the original Bourne Shell
that was not yet converted to use malloc() instead of sbrk().
All other shells grow very slowly.
Did you also check the behavior of dash? I ran that script for half an hour and it never allocated more memory.
– Gregory Nisbet
Apr 22 '16 at 2:52
Dash is slowly growing like ksh88 and ksh93. I removed the sleep and waited for some minutes.
– schily
Apr 22 '16 at 7:28
add a comment |
As you already discovered that this problem does not appear with dash, it seems to be obvious that there is a high probability that this is caused by a bug.
It does also grow if you are using bash-3.x but very slowly - still faster than with other shells.
I recommend you to make a bug-report against your version of bash.
BTW: I did some tests and there are only two shells where there is no growth at all - regardless how long you wait: mksh
and the original Bourne Shell
that was not yet converted to use malloc() instead of sbrk().
All other shells grow very slowly.
Did you also check the behavior of dash? I ran that script for half an hour and it never allocated more memory.
– Gregory Nisbet
Apr 22 '16 at 2:52
Dash is slowly growing like ksh88 and ksh93. I removed the sleep and waited for some minutes.
– schily
Apr 22 '16 at 7:28
add a comment |
As you already discovered that this problem does not appear with dash, it seems to be obvious that there is a high probability that this is caused by a bug.
It does also grow if you are using bash-3.x but very slowly - still faster than with other shells.
I recommend you to make a bug-report against your version of bash.
BTW: I did some tests and there are only two shells where there is no growth at all - regardless how long you wait: mksh
and the original Bourne Shell
that was not yet converted to use malloc() instead of sbrk().
All other shells grow very slowly.
As you already discovered that this problem does not appear with dash, it seems to be obvious that there is a high probability that this is caused by a bug.
It does also grow if you are using bash-3.x but very slowly - still faster than with other shells.
I recommend you to make a bug-report against your version of bash.
BTW: I did some tests and there are only two shells where there is no growth at all - regardless how long you wait: mksh
and the original Bourne Shell
that was not yet converted to use malloc() instead of sbrk().
All other shells grow very slowly.
edited Apr 21 '16 at 22:17
answered Apr 21 '16 at 22:00
schilyschily
10.9k31744
10.9k31744
Did you also check the behavior of dash? I ran that script for half an hour and it never allocated more memory.
– Gregory Nisbet
Apr 22 '16 at 2:52
Dash is slowly growing like ksh88 and ksh93. I removed the sleep and waited for some minutes.
– schily
Apr 22 '16 at 7:28
add a comment |
Did you also check the behavior of dash? I ran that script for half an hour and it never allocated more memory.
– Gregory Nisbet
Apr 22 '16 at 2:52
Dash is slowly growing like ksh88 and ksh93. I removed the sleep and waited for some minutes.
– schily
Apr 22 '16 at 7:28
Did you also check the behavior of dash? I ran that script for half an hour and it never allocated more memory.
– Gregory Nisbet
Apr 22 '16 at 2:52
Did you also check the behavior of dash? I ran that script for half an hour and it never allocated more memory.
– Gregory Nisbet
Apr 22 '16 at 2:52
Dash is slowly growing like ksh88 and ksh93. I removed the sleep and waited for some minutes.
– schily
Apr 22 '16 at 7:28
Dash is slowly growing like ksh88 and ksh93. I removed the sleep and waited for some minutes.
– schily
Apr 22 '16 at 7:28
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f278214%2fwhy-does-bash-4-3-keep-allocating-memory-in-a-script%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
This is unrelated to your problem, but what you are doing in this script could probably be done better with the
wait
command - or in a case this simple, just not backgrounding the process at all.– Score_Under
Jul 29 '16 at 14:28