loyalflow
loyalflow

Reputation: 14879

When calling a shell command via ruby, what context does the command run on?

In a rails application (or sinatra), if I make a call to a shell command, under what context does this command run?

I'm not sure if I am asking my question correctly, but does it run in the same thread as the rails process?

When you shell out, is it possible to make this a asychronous call? If yes, does this mean at the operating system level it will start a new thread? Can it start in a pool of threads instead of a new thread?

Upvotes: 0

Views: 794

Answers (2)

Jim Stewart
Jim Stewart

Reputation: 17323

It's more than just a new thread, it's a completely separate process. It will be synchronous and control will not return to Ruby until the command has completed. If you want a fire-and-forget solution, you can simply background the task:

$ irb

irb(main):001:0> system("sleep 30 &")
=> true
irb(main):002:0>

$ ps ax | grep sleep

3409 pts/4    S      0:00 sleep 30

You can start as many processes as you want via system("foo &") or`foo &`.

If you want more control over launching background processes from Ruby, including properly detaching ttys and a host of other things, check out the daemons gem. That's more suitable for long-running processes that you want to manage, with PID files, etc., but it's also possible to just launch tasks with it.

There are alternative solutions for managing background processes depending on your needs. The resque gem is popular for queuing and managing background jobs. It requires Redis and some setup, but it's good if you need that level of control.

Upvotes: 0

ZirconCode
ZirconCode

Reputation: 817

If you are using system('cmd') or simply backticks:

`cmd`

Then the command will be executed in the context of a subshell. If you wish to run multiple of these at a time, you can use Rubys fork functionality:

fork { system('cmd') }
fork { system('cmd') }

This will create multiple subprocessess which run the individual commands in their respective subshells.

Read up on forking here: http://www.ruby-doc.org/core-2.0/Process.html#method-c-fork

Upvotes: 1

Related Questions