在 Node.js 服务器完成启动后,以 kiosk 模式打开 localhost:3000
Open localhost:3000 in kiosk mode after the Node.js server has finished spinning up
我正在从事一个 raspberry pi 项目,该项目涉及 运行 在 kiosk 模式下安装节点服务器。
我正在使用 BROWSER=none
禁止在服务器 运行 时默认打开本地主机。
我想我应该能够使用 wait-on
来强制 bash 脚本 运行 的信息亭模式等到服务器完全启动。我会用这样的东西吗?
"scripts": {
...
"kiosk": "concurrently -n \"npm start\" \"wait-on http://localhost:3000 & /home/pi/kiosk.sh\""
},
它给了我以下我不太能破译的错误:
[npm start] server does not have extension for -dpms option
[npm start] libEGL warning: DRI2: failed to authenticate
[npm start] [1498:1498:1125/180040.467781:ERROR:gpu_init.cc(441)] Passthrough is not supported, GL is egl
[npm start] [1498:1498:1125/180040.786918:ERROR:viz_main_impl.cc(162)] Exiting GPU process due to errors during initialization
[npm start] [1558:1558:1125/180041.392714:ERROR:gpu_init.cc(441)] Passthrough is not supported, GL is swiftshader
[npm start] [1443:1590:1125/180042.359030:ERROR:object_proxy.cc(622)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[npm start] [1443:1590:1125/180042.364570:ERROR:object_proxy.cc(622)] Failed to call method: org.freedesktop.UPower.GetDisplayDevice: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[npm start] [1443:1590:1125/180042.367155:ERROR:object_proxy.cc(622)] Failed to call method: org.freedesktop.UPower.EnumerateDevices: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[npm start] Fontconfig error: Cannot load default config file: No such file: (null)
我现在意识到我的代码中的错误与 kiosk.sh
有关,而不是与 npm
命令有关。这是 kiosk.sh
:
的代码
#!/bin/bash
xset s noblank
xset s off
xset -dpms
unclutter -root &
sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' /home/pi/.config/chromium/Default/Preferences
sed -i 's/"exit_type":"Crashed"/"exit_type":"Normal"/' /home/pi/.config/chromium/Default/Preferences
/usr/bin/chromium-browser --noerrdialogs --disable-infobars --kiosk http://localhost:3000/ &
我假设您正在使用“wait-on”包 (https://www.npmjs.com/package/wait-on)。 wait-on命令前面没有npm使用
尝试使用
wait-on http://localhost:3000 && /home/pi/kiosk.sh
一旦服务器准备就绪,您可以使用“child_process”npm 包来执行您的 bash 脚本。假设您在后端使用 Express.js,只需稍加修改就可以使用
const exec = require('child_process');
//all your other codes and whatevers
app.listen(3000, () => {
var kiosk = exec('sh kiosk.sh',
(error, stdout, stderr) => {
if (error) {
console.log(`exec error: ${error}`);
}
});
});
&
和&&
表示不同的东西,&&
表示AND,&
表示后台进程,运行后台服务并继续下一个。
我认为你想做的是 wait-on service && example
,而不是 wait-on service & example
。
你所做的会发生什么是它将 运行 等待,然后立即后台处理它,然后立即 运行 shell 脚本而不等待任何事物。在服务器启动之前,您的脚本将 运行。
虽然那不是你的问题,我相信你的问题是铬本身。这里有一个未解决的问题:https://bugs.chromium.org/p/chromium/issues/detail?id=1221905&q=Passthrough%20is%20not%20supported%2C%20GL%20is%20swiftshader&can=1。该问题最后一次更新是在今年早些时候,但似乎仍未解决。
这里还有另一个答案:。
我看到很多人建议您使用 --headless
和 --disable-gpu
以及 --disable-software-rasterizer
。人们提到其中一些选项仅在 windows 上是必需的,有些已经修复,我不知道其中哪些是实际需要的。
此处回答:Force headless chromium/chrome to use actual gpu instead of Google SwiftShader,提到您可以使用 --enable-webgl
强制 webgl 以防止它加载 swiftshader 并使用 gpu。如果你需要在无头模式下强制它,你可以这样做。
好像跟webgl或者硬件加速有关系。显然,如果您禁用了 gpu 加速,然后它被迫回退到 swiftloader,就会发生这种情况。
我不知道其中哪一个能真正帮助到您,您将不得不尝试一下。但是,由于铬中的这个错误,我看到了 2021 年期间出现的 10 多个不同的铬和其他相关问题。
更重要的是,我不确定它实际上是一个严重错误,有人提到它只是显示错误但可以忽略。不知道是不是这样
wait-on
等到进程关闭。你没有关闭铬,所以它永远不会继续。如果你想等到服务器 运行ning。您可以将服务器的状态记录到一个文本文件中,然后让您的 bash 脚本循环读取它,直到它包含您指定的就绪文本。
如果您想毫无疑问地确认服务器运行正在按需运行。
您可以安装 npm 包 puppetter。然后使用 运行 使用 page.goto
命令从 bash 创建和 运行 节点脚本以在 Chromium 实例中加载网页并使用 waitForSelector
检查是否 DOM 您的网页的元素存在。
然后你使用调用 process.exit()
和任何你想使用的错误代码来确认页面是活的并且 运行ning.
我正在从事一个 raspberry pi 项目,该项目涉及 运行 在 kiosk 模式下安装节点服务器。
我正在使用 BROWSER=none
禁止在服务器 运行 时默认打开本地主机。
我想我应该能够使用 wait-on
来强制 bash 脚本 运行 的信息亭模式等到服务器完全启动。我会用这样的东西吗?
"scripts": {
...
"kiosk": "concurrently -n \"npm start\" \"wait-on http://localhost:3000 & /home/pi/kiosk.sh\""
},
它给了我以下我不太能破译的错误:
[npm start] server does not have extension for -dpms option
[npm start] libEGL warning: DRI2: failed to authenticate
[npm start] [1498:1498:1125/180040.467781:ERROR:gpu_init.cc(441)] Passthrough is not supported, GL is egl
[npm start] [1498:1498:1125/180040.786918:ERROR:viz_main_impl.cc(162)] Exiting GPU process due to errors during initialization
[npm start] [1558:1558:1125/180041.392714:ERROR:gpu_init.cc(441)] Passthrough is not supported, GL is swiftshader
[npm start] [1443:1590:1125/180042.359030:ERROR:object_proxy.cc(622)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[npm start] [1443:1590:1125/180042.364570:ERROR:object_proxy.cc(622)] Failed to call method: org.freedesktop.UPower.GetDisplayDevice: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[npm start] [1443:1590:1125/180042.367155:ERROR:object_proxy.cc(622)] Failed to call method: org.freedesktop.UPower.EnumerateDevices: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[npm start] Fontconfig error: Cannot load default config file: No such file: (null)
我现在意识到我的代码中的错误与 kiosk.sh
有关,而不是与 npm
命令有关。这是 kiosk.sh
:
#!/bin/bash
xset s noblank
xset s off
xset -dpms
unclutter -root &
sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' /home/pi/.config/chromium/Default/Preferences
sed -i 's/"exit_type":"Crashed"/"exit_type":"Normal"/' /home/pi/.config/chromium/Default/Preferences
/usr/bin/chromium-browser --noerrdialogs --disable-infobars --kiosk http://localhost:3000/ &
我假设您正在使用“wait-on”包 (https://www.npmjs.com/package/wait-on)。 wait-on命令前面没有npm使用
尝试使用
wait-on http://localhost:3000 && /home/pi/kiosk.sh
一旦服务器准备就绪,您可以使用“child_process”npm 包来执行您的 bash 脚本。假设您在后端使用 Express.js,只需稍加修改就可以使用
const exec = require('child_process');
//all your other codes and whatevers
app.listen(3000, () => {
var kiosk = exec('sh kiosk.sh',
(error, stdout, stderr) => {
if (error) {
console.log(`exec error: ${error}`);
}
});
});
&
和&&
表示不同的东西,&&
表示AND,&
表示后台进程,运行后台服务并继续下一个。
我认为你想做的是 wait-on service && example
,而不是 wait-on service & example
。
你所做的会发生什么是它将 运行 等待,然后立即后台处理它,然后立即 运行 shell 脚本而不等待任何事物。在服务器启动之前,您的脚本将 运行。
虽然那不是你的问题,我相信你的问题是铬本身。这里有一个未解决的问题:https://bugs.chromium.org/p/chromium/issues/detail?id=1221905&q=Passthrough%20is%20not%20supported%2C%20GL%20is%20swiftshader&can=1。该问题最后一次更新是在今年早些时候,但似乎仍未解决。
这里还有另一个答案:
我看到很多人建议您使用 --headless
和 --disable-gpu
以及 --disable-software-rasterizer
。人们提到其中一些选项仅在 windows 上是必需的,有些已经修复,我不知道其中哪些是实际需要的。
此处回答:Force headless chromium/chrome to use actual gpu instead of Google SwiftShader,提到您可以使用 --enable-webgl
强制 webgl 以防止它加载 swiftshader 并使用 gpu。如果你需要在无头模式下强制它,你可以这样做。
好像跟webgl或者硬件加速有关系。显然,如果您禁用了 gpu 加速,然后它被迫回退到 swiftloader,就会发生这种情况。
我不知道其中哪一个能真正帮助到您,您将不得不尝试一下。但是,由于铬中的这个错误,我看到了 2021 年期间出现的 10 多个不同的铬和其他相关问题。
更重要的是,我不确定它实际上是一个严重错误,有人提到它只是显示错误但可以忽略。不知道是不是这样
wait-on
等到进程关闭。你没有关闭铬,所以它永远不会继续。如果你想等到服务器 运行ning。您可以将服务器的状态记录到一个文本文件中,然后让您的 bash 脚本循环读取它,直到它包含您指定的就绪文本。
如果您想毫无疑问地确认服务器运行正在按需运行。
您可以安装 npm 包 puppetter。然后使用 运行 使用 page.goto
命令从 bash 创建和 运行 节点脚本以在 Chromium 实例中加载网页并使用 waitForSelector
检查是否 DOM 您的网页的元素存在。
然后你使用调用 process.exit()
和任何你想使用的错误代码来确认页面是活的并且 运行ning.