2013-03-19 37 views
2

我在Ubuntu 10.04服務器上執行了一些長時間運行的bash腳本,這些腳本正在執行備份和數據庫轉儲等操作。任何方式從網頁執行bash腳本並在執行時捕獲輸出?

我目前正在通過cron執行它們並將結果郵寄給我。但是,在整個Webinterface中另外手動觸發它們會很好。 (我不想讓任何用戶SSH訪問,以便他可以觸發腳本)

例如,在PHP中,有一個exec命令,它在腳本完成後獲取腳本輸出。由於腳本的持續時間超過了30秒瀏覽器超時,因此這並不有用。 (並且我想監視進度)所以我目前一直在尋找一種方法來定期收集腳本輸出或「拖尾」並通過JavaScript或Pagereloads或類似的東西顯示它。

正如我注意到的,Webmin例如在執行像apt一樣的系統命令通過其web界面時以某種方式執行此操作。

我可以想象的一種方法是分叉腳本執行並將輸出重定向到一個文件,而主進程正在讀取它的Page reload/Ajax請求。但這聽起來像某種解決方法:)

那麼,有沒有人有這個問題的一個很好的解決方案?不需要是PHP,也可以是python或perl或者其他服務器端的東西。或者是否有這樣的工具或圖書館?

任何想法非常感謝!

+1

您可以查看這些PHP解決方案: http://stackoverflow.com/questions/1281140/run-process-with-realtime-output-in-php – 2013-03-19 17:56:04

回答

2

我不知道,如果你的意思是需要PHP在您的解決方案,但如果沒有...

在過去,我已經使用了Jenkins這種事情。您可以將它作爲cron替換作爲手動觸發腳本的一種方式,同時保留所發生的日誌。

詹金斯可以設置,使得一些用戶只有權引發的工作,而不是在詹金斯管理員誰可以做的東西一樣設置和編輯工作等

,如果你喜歡收到的電子郵件,詹金斯也可以做到這一點。如果有的話,詹金斯最大的缺點是它是超靈活/可配置的,所以並不總是很明顯如何最好地根據自己的特殊需求進行設置。

+0

啊,好主意,我熟悉詹金斯,但沒有拿出使用它用於執行腳本。不管怎樣,詹金斯只是觸發一個腳本(並向用戶解釋)可能會有點頭痛。但它是一個非常好的主意! – achschneid 2013-03-19 17:55:22

+0

嗯,總覺得詹金斯更像是CI代碼測試/構建服務器工具。 – 2013-03-19 18:02:08

+0

我也是,所以我也沒有理解這一點。但它內置了cron功能,除了ant或maven目標外,它還可以執行系統命令。所以這可能是一個完美的方式。我會看看我能限制匿名用戶配置文件多少,然後可以試試Jenkins! – achschneid 2013-03-19 18:11:27

1

任何語言都可以使用。我可以推薦Webmin的大錘方法。

http://www.webmin.com/

的好處是你問在烘焙和你不會有任何東西編程。

在php中,您應該看看

緩衝區和沖洗。當您接收輸出時,您基本上可以輸出到頁面。

http://php.net/manual/en/function.ob-start.php

查看器一起語法時纔此相關的問題。

php shell_exec with realtime updating

+0

那麼,很好的使用webmin,如果你真的想做什麼webmin做:D,但我不想讓用戶訪問我的系統(這就像給他們ssh訪問),所以webmin可能不是正確的方法。感謝您關於PHP的提示,我會看看這個! – achschneid 2013-03-19 17:58:45

+1

我想你可能會創建一個非常有限的用戶帳戶,並限制webmin可以做的事情....這只是一個想法;) – 2013-03-19 17:59:55

0

我沒有類似的東西(快速和骯髒的,但可能不是很有效) 我使用的數據庫日誌表來存儲輸出(從後端腳本) 然後該網頁會使得週期性的Ajax請求得到的只有那些日誌,它以前沒有獲取並顯示(追加)到前端。

數據庫表是非常簡單的列

ID(自動遞增)

log_text

script_identifier(唯一的,如果你正在跟蹤多個腳本)

LAST_MODIFIED_TIME

output_displayed (值= 0表示該輸出未被ajax讀取)

一個簡單的過程會是這樣 打開一個網頁,點擊一個按鈕發送一個AJAX請求開始後端腳本 在每5秒發送另一個Ajax請求,看看是否有未讀的日誌錶行 如果有未讀行,將其標記爲已讀,取它們並顯示

你可以像 使用APC很多事情改善或memcached的,而不是數據庫表 保持日誌表小或動態創建日誌表爲每個腳本