我有一个纯HTML格式的单页应用程序,没有外部插件,并且为客户端使用全屏铬。 (kiosk模式)铬过程监控方法?如果崩溃,请重新启动
尽管Chromium本身非常稳定,但很小的崩溃,但是我希望它重新启动到页面,如果它真的崩溃了。
我认为这应该与一个像看门狗一样的外部过程来完成,但外部监视器如何镀铬?因为在进程表中有几个单独的进程。有时甚至崩溃,这个过程仍然存在。
任何建议或成熟soutuion?
我有一个纯HTML格式的单页应用程序,没有外部插件,并且为客户端使用全屏铬。 (kiosk模式)铬过程监控方法?如果崩溃,请重新启动
尽管Chromium本身非常稳定,但很小的崩溃,但是我希望它重新启动到页面,如果它真的崩溃了。
我认为这应该与一个像看门狗一样的外部过程来完成,但外部监视器如何镀铬?因为在进程表中有几个单独的进程。有时甚至崩溃,这个过程仍然存在。
任何建议或成熟soutuion?
我刚刚解决了这个问题。起初,我尝试使用流程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);
}
);
基本上,它是一个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'ing进入你的信息亭,并做一个ps axfww |grep render
,然后杀死列出的第一个进程,以便于测试。你会看到生病的电脑屏幕一秒钟,然后它会重新加载。