Методы контроля процесса хрома?Перезагрузите, если происходит сбой - PullRequest
4 голосов
/ 27 июня 2011

У меня есть одностраничное приложение, написанное в чистом HTML без внешних подключений и использующее полноэкранный хром для клиента. (режим киоска)

Хотя сам Chromium очень стабилен с очень незначительными сбоями, но я бы хотел, чтобы он перезапустился на странице, если он действительно дает сбой.

Я думал, что это должно быть сделано с помощью внешнего процесса, например сторожевого таймера. Но как внешний монитор хромирует? поскольку в таблице процессов есть несколько отдельных процессов. Иногда даже происходит сбой, процесс все еще жив.

Любое предложение или зрелый soutuion?

1 Ответ

0 голосов
/ 20 ноября 2013

Я просто решил это сам. Сначала я попытался использовать API процессов, но это не относится к той версии Chrome, которую я использую в киоске. Я настроил свой киоск с расширением, которое я написал для обработки других вещей (сенсорный ввод TUIO и т. Д.), Поэтому у меня уже было место для его добавления.

В моем киоске локально запущен небольшой веб-сервер, потому что я обнаружил, что хром для отображения файла: // 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);
    }
);

По сути, это ответчик на пинг. Если вы отправите ему сообщение, оно отправит его обратно.

Вот полностью 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);

Он прослушивает показ моей страницы и захватывает идентификатор вкладки. Это пингует ответчика. В документации говорится, что если произойдет ошибка, sendMessage будет вызван без ответа, но это не так. Это на самом деле не вызывается вообще. Я запрограммировал его на любой случай.

Обратите внимание, что я первоначально сказал ++ recv_count в обработчике, но если вы подумаете об этом, вышеприведенное будет немного более устойчивым к медлительности на принимающей странице.

Предполагая, что ваш киоск - это linux (то есть вы не ненормальный), тогда вы можете достаточно легко это проверить, выполнив команду ssh'ing в вашем киоске, и набрав ps axfww |grep render, а затем убейте первый процесс в списке. Вы увидите экран больного компьютера на секунду, а затем он перезагрузится.

...