Modifying parent shell's attributes?

I asked this on the rails list, but received no traction. Since it’s
more of a ruby question anyway, thought I’d give it a shot here.

I have a problem with one of my rake tasks. It loads a very large yaml
file into the db, but because of the default limitation on stack size
in the Linux shell, the task craps out. Executing “ulimit -s 16384”
fixes the issue, and the task completes just fine.

What I’d like to do within my task is this (in ruby-ish pseudo):

if on_linux?
set_stack_of_running_shell_via_ulimit 16384
end

Is there any way to do this? Can I modify the attributes of the shell
that is running me?

Thanks!
John

On 12/13/07, John W. [email protected] wrote:

if on_linux?
set_stack_of_running_shell_via_ulimit 16384
end

Is there any way to do this? Can I modify the attributes of the shell
that is running me?

Check out the Process class; specifically getrlimit and setrlimit. It
won’t change the shell, but it will change Ruby.

-austin

On 12/13/07, Marc H. [email protected] wrote:

Check out the Process class; specifically getrlimit and setrlimit. It
won’t change the shell, but it will change Ruby.

-austin

These are the little diamond things in ruby - bits of useful knowledge
:slight_smile:

Yep…thanks very much austin!

On 12/13/07, Austin Z. [email protected] wrote:

if on_linux?
set_stack_of_running_shell_via_ulimit 16384
end

Is there any way to do this? Can I modify the attributes of the shell
that is running me?

Check out the Process class; specifically getrlimit and setrlimit. It
won’t change the shell, but it will change Ruby.

Following up a bit late on this, but this doesn’t solve my problem.
for some reason.

I have tried:

Process.setrlimit Process::RLIMIT_STACK, Process::RLIM_INFINITY,
Process::RLIM_INFINITY
Process.setrlimit Process::RLIMIT_STACK, 0, Process::RLIM_INFINITY

Is this the proper usage? It still craps out with same error, but
setting ulimit in the calling shell to 16000 works just fine.

Thanks!
John

Check out the Process class; specifically getrlimit and setrlimit. It
won’t change the shell, but it will change Ruby.

-austin

These are the little diamond things in ruby - bits of useful knowledge
:slight_smile:

On Jan 1, 2008, at 9:59 PM, John W. wrote:

I have tried:

Process.setrlimit Process::RLIMIT_STACK, Process::RLIM_INFINITY,
Process::RLIM_INFINITY
Process.setrlimit Process::RLIMIT_STACK, 0, Process::RLIM_INFINITY

It looks like you are trying to increase the max stack size
to RLIM_INFINITY, which can only be done if you have super-user
access. What you want to do is to just raise the soft-limit. Try the
following in IRB and see if it works on your system:

include Process
=> Object

s = getrlimit RLIMIT_STACK
=> [8388608, 67108864]

setrlimit RLIMIT_STACK, s.first*2, s.last
=> nil

getrlimit RLIMIT_STACK
=> [16777216, 67108864]

In this example, I’m just changing the stack limit to twice its
default size, which is still less than the max limit of 67108864.

This example was done on a Mac OS 10.4 system.

Gary W.

On Jan 1, 2008, at 10:38 PM, John W. wrote:

I’m on Linux, and I’ve even done this:

Process.setrlimit Process::RLIMIT_STACK, 18446744073709551615,
18446744073709551615

And, based on what getrlimit says, it worked. However, same exception.

Even doing it as root, nothing else seems to work but ulimit -s 16000
from parent shell.

I’d avoid huge numbers like that–you may be causing other problems
because you are overcommitting memory. Just try using the same value
you have had success with via ulimit: 16384000 (in bytes).

How about calling Process.setrlimit in Ruby and then forking to
run your actually code?

Process.setrlimit Process::RLIMIT_STACK, new_limit, new_max

child = fork { do_work }
Process.wait(child)

Gary W.

On 1/1/08, Gary W. [email protected] wrote:

It looks like you are trying to increase the max stack size

getrlimit RLIMIT_STACK
=> [16777216, 67108864]

I’m on Linux, and I’ve even done this:

Process.setrlimit Process::RLIMIT_STACK, 18446744073709551615,
18446744073709551615

And, based on what getrlimit says, it worked. However, same exception.

Even doing it as root, nothing else seems to work but ulimit -s 16000
from parent shell.

ruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux]