You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Deno实现Linux(Lubuntu)主机自动关机?

通过Deno实现Linux主机自动关机(适配Minecraft服务器场景)

完全可行,针对你的Lubuntu(Linux)环境,结合sudo权限配置,可以实现无玩家30分钟后自动关机的需求,以下是具体实现步骤:

核心原理

Deno支持通过Deno.run调用系统命令,而Linux的关机操作依赖sudo shutdown -h now或sudo poweroff命令,只需配置好权限并编写对应逻辑即可。

步骤1:配置免密sudo(关键,避免手动输入密码)

因为自动关机场景无法手动输入sudo密码,需要给运行Deno脚本的用户配置免密执行关机命令的权限:

  1. 打开终端执行sudo visudo(安全编辑sudoers文件)
  2. 在文件末尾添加一行(替换pi为你的实际用户名,比如树莓派默认的pi用户):
    pi ALL=(ALL) NOPASSWD: /sbin/shutdown, /sbin/poweroff
    
  3. 保存退出(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:15:43