如何通过Deno实现Linux(Lubuntu)主机自动关机?
通过Deno实现Linux主机自动关机(适配Minecraft服务器场景)
完全可行,针对你的Lubuntu(Linux)环境,结合sudo权限配置,可以实现无玩家30分钟后自动关机的需求,以下是具体实现步骤:
核心原理
Deno支持通过Deno.run调用系统命令,而Linux的关机操作依赖sudo shutdown -h now或sudo poweroff命令,只需配置好权限并编写对应逻辑即可。
步骤1:配置免密sudo(关键,避免手动输入密码)
因为自动关机场景无法手动输入sudo密码,需要给运行Deno脚本的用户配置免密执行关机命令的权限:
- 打开终端执行
sudo visudo(安全编辑sudoers文件) - 在文件末尾添加一行(替换
pi为你的实际用户名,比如树莓派默认的pi用户):pi ALL=(ALL) NOPASSWD: /sbin/shutdown, /sbin/poweroff - 保存退出(visudo默认按
Ctrl+O保存,Ctrl+X退出)
步骤2:Deno实现关机逻辑
以下是结合Minecraft无玩家检测的示例代码,你需要替换自己的玩家检测逻辑:
// 自定义函数:检测Minecraft服务器是否30分钟无玩家 async function checkNoPlayersFor30Mins(): Promise<boolean> { // 这里替换你的实际检测逻辑: // 比如通过Rcon查询服务器玩家列表、分析日志文件的玩家活动记录等 // 示例直接返回true,模拟满足关机条件 return true; } // 执行关机操作的函数 async function triggerShutdown() { console.log("检测到30分钟无玩家,启动关机流程..."); // 调用sudo关机命令 const shutdownProcess = Deno.run({ cmd: ["sudo", "shutdown", "-h", "now"], stdout: "null", // 忽略标准输出 stderr: "null" // 忽略错误输出(如需调试可改为"inherit") }); // 等待关机命令执行(实际执行后系统会很快终止进程) await shutdownProcess.status(); // 主动退出Deno进程(保险措施) Deno.exit(0); } // 主执行逻辑 async function main() { try { const needShutdown = await checkNoPlayersFor30Mins(); if (needShutdown) { await triggerShutdown(); } } catch (error) { console.error("执行出错:", error); Deno.exit(1); } } main();
步骤3:运行脚本的权限要求
执行Deno脚本时,必须授予--allow-run权限以允许调用系统命令:
deno run --allow-run minecraft-auto-shutdown.ts
服务化运行注意事项
因为你的服务器管理软件是作为Linux服务自动启动的:
- 确保服务的运行用户(比如
pi)已经配置了上述免密sudo权限 - 在服务的systemd配置文件中,正确指定Deno脚本的启动命令,包含
--allow-run参数 - 测试阶段可以用
sudo shutdown -h +1(1分钟后关机)进行测试,若需取消可执行sudo shutdown -c
额外提示
- 确认树莓派的Wake on LAN功能已正确配置,确保能远程唤醒开机
- 配置sudoers时务必使用
visudo,避免语法错误导致sudo失效 - 可以在玩家检测逻辑中加入日志记录,方便排查问题
内容的提问来源于stack exchange,提问作者codepleb
相关产品推荐
相关产品推荐

