# System calls prohibited?

**URL:** <https://www.ruby-forum.com/t/system-calls-prohibited/149233>\
**Category:** Rails\
**Created:** [September 22, 2008, 6:52pm UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233 "2008-09-22T18:52:56Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![milo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@milo](https://www.ruby-forum.com/u/milo)\
**Post date:** [September 22, 2008, 6:52pm UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233/1 "2008-09-22T18:52:56Z")

</div>

I have a controller method written along these lines:

begin  
system("/script/that/generates/output \> text\_file")  
var += IO.readlines(“text\_file”)  
send\_data var, :filename =\> “attachment.txt”, :disposition =\>  
‘attachment’, :type =\> ‘text/plain’  
rescue  
flash[:error] = “Error message here”  
redirect\_to :action =\> ‘error\_page’  
end

What this is supposed to do is send the contents of the text file plus  
some other data directly to the user. The problem is, of course, that  
the system call will not run from a Rails controller as this is  
apparently considered very naughty. I could instead use backgroundrb to  
generate the file (the same system call is fine as part of a  
backgroundrb job) and then e-mail it to users but I would rather send it  
immediately as the attachment is virtually instantaneous. Is  
backgroundrb really the only way to do that? It seems a bit much for  
such a small task.

---

<div class="post-metadata">

**Author:** ![milo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@milo](https://www.ruby-forum.com/u/milo)\
**Post date:** [September 22, 2008, 9:08pm UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233/2 "2008-09-22T21:08:36Z")

</div>

Hi Milo,

Milo T. wrote:

> The problem is, of course, that the system call will  
> not run from a Rails controller as this is apparently  
> considered very naughty.

I’m not sure what you’re talking about. You can make system calls.

To test, in a list method in a controller, put the line

system(‘dir \> dir\_test.txt’)

or the equivalent depending on what OS you’re using. You should find  
the  
file in the app root directory.

You might want to check your log files to see what they tell you about  
your  
current situation.

HTH,  
Bill

---

<div class="post-metadata">

**Author:** ![milo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@milo](https://www.ruby-forum.com/u/milo)\
**Post date:** [September 22, 2008, 9:46pm UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233/3 "2008-09-22T21:46:24Z")

</div>

Bill W. wrote:

> I’m not sure what you’re talking about. You can make system calls.

I did a search of this group and found advice against system calls.

> You might want to check your log files to see what they tell you about  
> your  
> current situation.

They tell me absolutely nothing, unfortunately. The system call fails  
with no message in the logs, and yet I can run the same system call  
successfully on the command line as the same user. My assumption was  
that system calls were not allowed but perhaps I was mistaken and there  
is something else very strange going on.

---

<div class="post-metadata">

**Author:** ![milo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@milo](https://www.ruby-forum.com/u/milo)\
**Post date:** [September 22, 2008, 10:27pm UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233/4 "2008-09-22T22:27:12Z")

</div>

Bill W. wrote;

> When you say ‘fails’ I assume you mean you just can’t find the file you  
> expect to be created anywhere on your system.

That’s part of it. I tried setting things up as in this pseudocode:

begin  
logger.info(“ONE”)  
first system call  
logger.info(“TWO”)  
second system call  
logger.info(“THREE”)  
rescue  
redirect to the error page  
end

In this case the expected file does not appear, “ONE” is found in the  
log but not “TWO” or “THREE”, and the app. redirects to the error page.  
It seems that the system call is a complete failure with no explanation.

> When you say ‘on the command line’, do you mean from irb or  
> script\console ?  
> Or do you mean ‘from the OS command line’? If the latter, it’s  
> potentially  
> a permissions issue.

I tried it on the OS command line. I thought that it might be  
permissions, but I’d run script/server as a user that has write  
permission to the relevant directory. I’d also expect some sort of  
permissions error in the logs from the system call but none were to be  
found. I hadn’t tried it with irb or script/console but I just did and  
it worked as expected. Very odd…

Thanks for taking the time to make some suggestions!

---

<div class="post-metadata">

**Author:** ![milo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@milo](https://www.ruby-forum.com/u/milo)\
**Post date:** [September 22, 2008, 10:06pm UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233/5 "2008-09-22T22:06:12Z")

</div>

Hi Milo,

Milo T. wrote:

> The system call fails with no message in the logs,  
> and yet I can run the same system call successfully  
> on the command line as the same user.

When you say ‘fails’ I assume you mean you just can’t find the file you  
expect to be created anywhere on your system. If there’s something  
visible  
happening that you can report, it would help.

When you say ‘on the command line’, do you mean from irb or  
script\console ?  
Or do you mean ‘from the OS command line’? If the latter, it’s  
potentially  
a permissions issue. Note that your rails app runs as a different user  
than  
you. Try to run it as that user and see what happens.

HTH,  
Bill

---

<div class="post-metadata">

**Author:** ![milo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@milo](https://www.ruby-forum.com/u/milo)\
**Post date:** [September 23, 2008, 10:43am UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233/6 "2008-09-23T10:43:15Z")

</div>

Hemant K. wrote:

> Also, in rails system() or `backticks are only not advised, when they end up blocking the master mongrel process for a real long time, otherwise you can happily use system() or` within your programs  
> without problems.

Thanks - evidently I had jumped to the wrong conclusion.  
It looks like one of the object methods included in #{} within the  
system call is failing; it’s strange that there’s no error message but  
that must be the cause.

---

<div class="post-metadata">

**Author:** ![milo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@milo](https://www.ruby-forum.com/u/milo)\
**Post date:** [September 23, 2008, 6:53pm UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233/7 "2008-09-23T18:53:24Z")

</div>

On Sep 23, 1:43 am, Milo T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Thanks - evidently I had jumped to the wrong conclusion.  
> It looks like one of the object methods included in #{} within the  
> system call is failing; it’s strange that there’s no error message but  
> that must be the cause.

Sometimes exception handling code can eat useful error messages,  
especially if you don’t capture and display the exception object, you  
may miss useful info. When diagnosing things, I occasionally find it  
is useful to comment out the rescue clause and let the error bubble to  
the surface. Alternatively, capture it (e.g. rescue Exception =\> e)  
and display in your rescue clause with a logger or similar output.

-c

---

<div class="post-metadata">

**Author:** ![milo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@milo](https://www.ruby-forum.com/u/milo)\
**Post date:** [September 23, 2008, 7:35pm UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233/8 "2008-09-23T19:35:34Z")

</div>

Chris Haupt wrote:

> Alternatively, capture it (e.g. rescue Exception =\> e)  
> and display in your rescue clause with a logger or similar output.

A very useful suggestion - thanks!

---

<div class="post-metadata">

**Author:** ![milo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/85e7bf/32.png) [@milo](https://www.ruby-forum.com/u/milo)\
**Post date:** [September 23, 2008, 12:27am UTC](https://www.ruby-forum.com/t/system-calls-prohibited/149233/9 "2008-09-23T00:27:02Z")

</div>

On Tue, Sep 23, 2008 at 1:57 AM, Milo T.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> logger.info(“TWO”)
> 
> > When you say ‘on the command line’, do you mean from irb or  
> > it worked as expected. Very odd…
> 
> Thanks for taking the time to make some suggestions!

Rather than using system() you can use backticks `echo "hello"` to  
capture output of a command, which will tell you more about, what  
happened to the call.

Also, in rails system() or `backticks are only not advised, when they end up blocking the master mongrel process for a real long time, otherwise you can happily use system() or` within your programs  
without problems.
