回答
要判断某个脚本是否正在运行,可以使用 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 生成,可能不准确,请注意核实