2

Ubuntu 10.04 サーバーで、バックアップやデータベース ダンプなどを実行する長時間実行される bash スクリプトを取得しました。

私は現在、それらを cron 経由で実行し、結果をメールで送信しています。ただし、さらに Web インターフェイス全体で手動でトリガーすることをお勧めします。(ユーザーがスクリプトをトリガーできるように、ユーザーに SSH アクセスを許可したくありません)

たとえば、PHP には、スクリプトの終了後にスクリプト出力を取得する exec コマンドがあります。スクリプトは 30 秒のブラウザ タイムアウトよりも長く続くため、これは役に立ちません。(そして進行状況を監視したい)そのため、現在、スクリプト出力を定期的に収集する方法、または「テーリング」してJavaScriptまたはPagereloadsなどを介して表示する方法を見つけることに行き詰まっています。

私が気づいたように、たとえば Webmin は、Web インターフェイスを介して apt などのシステム コマンドを実行すると、何らかの形でこれを行っています。

私が想像できる 1 つの方法は、メイン プロセスがページのリロード/Ajax 要求でそれを読み取っている間に、スクリプトの実行をフォークして出力をファイルにリダイレクトすることです。しかし、これはどういうわけか回避策のように聞こえます:)

それで、誰かがこの問題の良い解決策を持っていますか? PHP である必要はありません。Python や Perl など、サーバー側のものでもかまいません。または、そのようなツールやライブラリはありますか?

どんなアイデアでも大歓迎です!

4

3 に答える 3

2

ソリューションで PHP を要求するつもりかどうかはわかりませんが、そうでない場合は…</p>

過去に、私はこの種のことにJenkinsを使用しました。何が起こったかのログを保持しながら、cron の代替として、またスクリプトを手動でトリガーする方法として使用できます

Jenkins は、ジョブの設定や編集などを実行できる Jenkins 管理者とは対照的に、一部のユーザーがジョブをトリガーする権限のみを持つように設定できます。

また、メールを受け取るのが好きなら、Jenkins もそれを行うことができます。どちらかといえば、Jenkins の最大の欠点は、非常に柔軟で構成可能であるため、特定のニーズに合わせて設定する最善の方法が常に明らかであるとは限らないことです。

于 2013-03-19T17:44:31.117 に答える
1

どの言語でも機能します。Webmin であるハンマー アプローチをお勧めします。

http://www.webmin.com/

利点は、あなたが求めたものが組み込まれており、何もプログラムする必要がないことです。

phpでは、あなたが見るべきです

バッファとフラッシュ。出力を受け取ると、基本的にページに出力できます。

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

popen 構文については、この関連する質問を参照してください。

リアルタイム更新によるphp shell_exec

于 2013-03-19T17:44:19.683 に答える
0

私は似たようなことをしました (迅速で汚れていますが、あまり効率的ではないかもしれません) データベース ログ テーブルを使用して (バックエンド スクリプトから) 出力を格納しました。その後、Web ページは定期的な ajax リクエストを作成して、取得していないログのみを取得します。前もってフロントエンドに表示(追加)します。

データベーステーブルは列で非常に単純でした

id(自動インクリメント)

ログテキスト

script_identifier (複数のスクリプトを追跡している場合は一意)

last_modified_time

output_displayed (値 = 0 は、この出力が ajax によって読み取られていないことを示します)

簡単なプロセスは次のようになります Web ページを開き、ボタンをクリックして ajax リクエストを送信し、バックエンド スクリプトを開始します 5 秒ごとに別の ajax リクエストを送信して、未読のログ テーブル行があるかどうかを確認します 未読の行がある場合は、それらをマークします読み取ったとおりにフェッチして表示する

データベーステーブルの代わりにapcまたはmemcachedを使用するなど、多くの点で改善できますログテーブルを小さく保つか、スクリプトごとにログテーブルを動的に作成します

于 2013-03-19T18:00:01.830 に答える