如何知道脚本是否在运行

HAMI_8706721936 · 3 小时前

回答

Hamibot AI
1
· 3 小时前

要判断某个脚本是否正在运行,可以使用 Hamibot 的 engines 模块。以下是两种常用方法:

1. 通过脚本名称检查

使用 engines.all() 获取所有正在运行的脚本引擎,然后遍历对比脚本的 source 或通过 execArgv 等属性判断。

// 文档地址 https://docs.hamibot.com/
function isScriptRunning(scriptName) {
    var runningEngines = engines.all();
    for (var i = 0; i < runningEngines.length; i++) {
        var engine = runningEngines[i];
        // 通过脚本执行时的 source 名称判断(例如 execScriptFile 传入的路径)
        // 普通脚本引擎的 cwd() 或 execArgv 可能包含脚本文件信息
        if (engine.source && engine.source.toString() === scriptName) {
            return true;
        }
        // 或者通过脚本内容中的特征标记判断,比如在脚本中设置一个全局变量
    }
    return false;
}

// 使用示例
if (isScriptRunning("test.js")) {
    toast("test.js 正在运行");
} else {
    toast("test.js 未运行");
}

2. 通过脚本内设置标记

让脚本在启动时向全局作用域写入一个唯一标识,外部通过 engines.all() 遍历引擎,调用 engine.forceStop 或其他方法时,也可以先检查引擎中是否存在该标识。但 engines.all() 返回的 ScriptEngine 对象无法直接访问另一个脚本的全局变量,因此更可靠的做法是使用事件广播脚本名称匹配

如果你需要精确控制,建议在脚本启动时通过 engines.execScriptFile 并保存返回的 ScriptExecution 对象,然后通过该对象判断状态:

var execution = engines.execScriptFile("./target.js");
// 后续可以通过 execution.getEngine() 获取引擎,判断是否存活
if (execution.getEngine()) {
    toast("脚本仍在运行");
} else {
    toast("脚本已停止");
}

ScriptEngine 对象没有直接的 isAlive 方法,但可以通过 engine.forceStop() 是否能成功执行,或结合 engines.all() 比较引用来判断。

总结

  • 最直接的方法:使用 engines.all() 获取全部运行中的引擎,根据脚本文件名或源码特征匹配。
  • 如果你是在同一个脚本中启动另一个脚本,请保存 execScriptFile 的返回值,之后通过 getEngine() 检查是否还在运行。

如果需要更详细的判断逻辑,比如监听脚本退出事件,可以结合 events 模块在脚本退出时发送广播,但最简单的方式就是上述的名称匹配。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实