rubypopen3

Executing the top command using Open3 in ruby


I am trying to execute the "top -n 1" command in ruby using the Open3 module in ruby.

This is my code

command = "top -n 1"
Open3.popen3 (command) do |i,o,e,t|
        i.close
        exit_status = t.value
        unless exit_status.success?
                puts "NOPE"
        end
        t.value
end

All I get is NOPE. Even if I try to print o.read or o.gets all I get is a blank line.

Is there anyway I can use open3 to execute that command? Are there any other ways of executing it ? Am I doing something wrong?

I see that I can use the backticks(`) to execute system command. Is that a good practice? I saw several articles and blogs saying it isn't.

Thanks in advance.


Solution

  • You can see your problem by printing block parameter e:

    The error should be like this:

    top: failed tty get

    This is common when trying to run top in non-interactive mode. To override this, you need the -b option of top.

    -b  :Batch-mode operation
        Starts top in Batch mode, which could be useful for sending output from top to other programs or to a file.  In this mode, top will not accept  input  and
        runs until the iterations limit you've set with the `-n' command-line option or until killed.
    

    command = 'top -bn 1' is ok then.

    Also there are many ways for system calling in ruby, check them here.