2010-09-03 136 views
8

想象一下,一個web應用程序允許登錄的用戶在按下按鈕時在web服務器上運行shell命令。在大多數語言中,這通過一些標準的庫操作系統工具相對簡單。從基於Web的界面運行shell命令的最佳方式是什麼?

但是,如果該命令長時間運行,你不希望你的用戶界面掛起。同樣,使用某種後臺進程或者將命令執行到消息隊列中可能相對容易處理(也可能將輸出和狀態保存在某處供以後使用)。只需快速返回就可以運行,並返回給您。

我想要做的是顯示所述web ui觸發的shell命令的輸出,其發生在。所以垂直滾動文本就像在終端中運行一樣。

我有一個模糊的想法,我可能會如何處理這個問題,將輸出流式傳輸到websocket,也許只是將輸出打印到屏幕上。

我想什麼要問的是:

是他們已經做任何插件,庫或應用程序。我可以使用的東西或閱讀的來源。理想情況下,一個開源的python/django或ruby/rails工具,但其他堆棧也會很有趣。

回答

1

於是,我試着回答我的問題與代碼,我不能」找到任何符合法案的東西。希望對遇到同樣問題的任何人都有用。

Redbeard 0X0A指向我的大方向,我能夠得到一個紅寶石腳本的立場,做我想用popen做的事情。將其擴展到使用EventMachine(因爲它提供了編寫WebSocket服務器的便捷方式)並使用它內置的popen方法解決了我的問題。

這裏http://morethanseven.net/2010/09/09/Script-running-web-interface-with-websockets.html更多細節,並在http://github.com/garethr/bolt/

1

我不確定它是否是你想要的,但有一些基於Web的ssh客戶端。如果您關心安全性,並且只是想獲得動態反饋,那麼您可以查看彗星,或者擁有一個擁有自己的http會話的框架,該會話在完成打印之前不會結束。

1

我沒有聽說這樣做的任何庫,但你需要設置系統命令,調出系統。然後,您需要「泵」sysout和syserr標準輸入,並將該數據傳回給您的Web客戶端。

作爲這種風格問題的一個例子,請查看人們如何使用ruby/python/etc對視頻進行代碼轉換的代碼snippits,即http://kpumuk.info/ruby-on-rails/encoding-media-files-in-ruby-using-ffmpeg-mencoder-with-progress-tracking/ - 我的示例來自此博客帖子。

class MediaFormatException < StandardError 
end 

def execute_mencoder(command) 
    progress = nil 
    IO.popen(command) do |pipe| 
    pipe.each("r") do |line| 
     if line =~ /Pos:[^(]*(s*(d+)%)/ 
     p = $1.to_i 
     p = 100 if p > 100 
     if progress != p 
      progress = p 
      print "PROGRESS: #{progress}n" 
      $defout.flush 
     end 
     end 
    end 
    end 
    raise MediaFormatException if $?.exitstatus != 0 
end 

我不知道這個例子從兩個系統輸出和SYSERR拉取數據,但你肯定會需要從兩個這些接口的拉取數據,通常如果緩衝區已滿,執行命令可能掛起或失敗(我已經與Python經歷了這一點)。如果你做的唯一的事情是返回line給網絡客戶端,這種方法也會看起來不同 - 在終端中,ffmpeg/mencoder的進度指示器在底線上保持不變,但是這種方法會給你一個長長的進度指示器列表更新。管道line到您的終端,你會看到我指的是什麼。

+0

謝謝。簡化這種方法會給我後端,我認爲 - 使用IO.popen將逐行返回輸出。然後只需要把它放到前端。 – Garethr 2010-09-04 12:10:37

0

當然不是最好的方式運行shell命令,但可能最簡單的:

#!/bin/sh 

echo Content-Type: text/plain 
echo 

/usr/bin/uptime 

http://www.sente.cc/scripts/uptime.cgi

+0

運行該命令的問題較少,我更感興趣的是在Web界面中顯示命令行的輸出 – Garethr 2010-09-04 11:55:43

0

代碼看看Galaxy(在線demo)或Yabi

除了能夠在作業運行期間顯示輸出的要求,它們都是優秀的解決方案!它們也都是Python寫的(甚至在django上也是Yabi)。

它們都是以生物信息學爲基礎構建的,但實際上它們都是通用的工作流程/工作流程工具。

它們將允許您在Web界面中指定參數,在單獨的列中查看排隊/運行/完成的作業,並在作業完成後檢查詳細信息和結果,或重新運行作業,並可能更改參數。

Galaxy更容易安裝。銀河安裝歸結爲下載並運行「SH run.sh」),並加入自己的工具歸結爲線創建的XML文件:

<tool id="mytool" name="My Tool" version="1.0.0"> 
    <description>Does this and that</description> 
    <command>somecommand --aparam $aparam</command> 
    <inputs> 
    <param name="aparam" type="text" label="A parameter"/> 
    </inputs> 
    <outputs> 
    <data name="outfile" format="tabular"/> 
    </outputs> 
</tool> 

...,並將其放置在/工具文件夾,然後在tool_conf.xml中添加一行來告訴你的新工具的星系(在那裏你也可以擺脫生物信息學工具,所以它們不會搞亂你的工具菜單)。

Yabi安裝起來比較複雜(請參閱自述文件),但如果您使用的是正確的系統,則該過程可能很順利。另一方面,它甚至可以在Web界面中進行工具配置,而不是像銀河那樣的XML文件。

儘管Galaxy仍然是社區中最大的一個,但這反映在功能/已經集成的工具的數量上(請參閱共享工具/包裝的toolshed)。

相關問題