铬过程监控方法?崩溃时重新启动

时间:2011-06-27 03:37:44

标签: linux google-chrome process chromium

我有一个用纯HTML编写的单页应用程序,没有外部插件,并为客户端使用全屏铬。 (自助终端模式)

虽然Chromium本身非常稳定且崩溃非常轻微,但我想重新启动它,如果它真的崩溃了。

我认为这应该通过像看门狗这样的外部流程完成,但是外部显示器如何镀铬?因为流程表中有几个单独的流程。有时即使崩溃,这个过程仍然存在。

任何建议或成熟的soutuion?

1 个答案:

答案 0 :(得分:0)

我自己就解决了这个问题。起初我尝试使用进程API,但这不是我在自助服务终端上使用的chrome版本。我已经为我的自助服务终端配置了我写的处理其他东西(TUIO触摸输入等)的扩展程序,所以我已经有了添加它的地方。

我的自助服务终端在本地运行一个小型网络服务器,因为我发现让铬显示文件://网址过于痛苦。如果您使用的是文件网址,则您的清单需要与这些网址匹配,而不是http网址。

这是来自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。它叮嘱响应者。文档说如果发生错误,sendMessage将被调用而没有响应,但事实并非如此。它实际上根本没有被调用。我把它编码为处理任何一种情况。

请注意,我最初在处理程序中说过++ recv_count,但是如果你考虑一下,上面的内容对于接收页面的缓慢会更加健壮。

假设您的自助服务终端是linux(也就是说,您并非精神错乱),那么您可以通过ssh进入自助服务终端轻松测试,并执行ps axfww |grep render然后终止列出的第一个进程。你会看到生病的电脑屏幕一秒钟,然后它会重新加载。