4

外部プラグを使用せず、クライアントに全画面クロムを使用する、純粋な HTML で記述された単一ページのアプリがあります。(キオスクモード)

Chromium自体は非常に安定しており、非常に小さなクラッシュが発生しますが、本当にクラッシュする場合は、ページを再起動したいと考えています.

これは、ウォッチドッグのような外部プロセスで行う必要があると思いますが、外部モニターはどのようにクロムになりますか? プロセス テーブルにはいくつかの個別のプロセスがあるためです。クラッシュすることもありますが、プロセスはまだ生きています。

提案や成熟した解決策はありますか?

4

1 に答える 1

0

私はこれを自分で解決しました。最初はプロセス API を使用してみましたが、キオスクで使用している chrome のバージョンにはありません。他のもの (TUIO タッチ入力など) を処理するために作成した拡張機能を使用してキオスクを構成したので、既にそれを追加する場所がありました。

私のキオスクは、ローカルで小さな Web サーバーを実行しています。なぜなら、chrome を取得して file:// urls を表示するのは、首に負担がかかりすぎるからです。ファイル URL を使用している場合、マニフェストは http URL ではなく、それらと一致する必要があります。

manifest.json の重要な内容は次のとおりです。

"content_scripts": [
    {
        "matches": ["http://*/*"],
        "js": ["kiosk.js"]
    }
],

"background": {
    "scripts": [
        "background.js"
    ]
},

"permissions": [
    "webNavigation",
    "tabs",
    "runtime",
    "<all_urls>"
],

これは kiosk.js に入ります。

chrome.runtime.onMessage.addListener(
    function(message, sender, response) {
        response(message);
    }
);

基本的に、これは ping レスポンダーです。メッセージを送信すると、すぐに返信されます。

これが background.js の全体です。

var tab_id = -1;
var send_count = 0;
var recv_count = 0;

chrome.webNavigation.onBeforeNavigate.addListener(function (details) {
    tab_id = details.tabId;
});

setInterval(function() {
    if (tab_id == -1) return;
    if (send_count > recv_count+2) {
        chrome.tabs.reload(tab_id);
        send_count = recv_count = 0;
    }
    ++send_count;
    chrome.tabs.sendMessage(tab_id, "heartbeat", function(resp) {
        if (resp) {
            recv_count = send_count;
        }
    });
}, 1000);

私のページが表示されるのをリッスンし、タブ ID を取得します。レスポンダに ping を送信します。ドキュメントには、エラーが発生した場合、sendMessage が応答なしで呼び出されると書かれていますが、そうではありません。実際にはまったく呼び出されません。どちらの場合も処理できるようにコーディングしました。

なお、もともとハンドラ内で ++recv_count と言っていましたが、考えてみれば上記の方が受信側の遅さにはもう少し強いと思います。

あなたのキオスクが Linux であると仮定すると (つまり、あなたは正気ではありません)、キオスクに ssh 接続し、ps axfww |grep renderリストにある最初のプロセスを実行して強制終了することで、これを簡単にテストできます。病気のコンピューター画面が数秒間表示された後、リロードされます。

于 2013-11-20T16:18:58.857 に答える