Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

[Bug] 启动器目标进程搜索超时固定 30 秒且不可配置,更新耗时较长时被误杀

Đang mở
#73 4 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức phù hợp với người mới
76/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python
Lĩnh vực
tooling

Hướng nghiên cứu

Bắt đầu trong src/script_chainer/win_exe/script_runner.py, nơi open_process nhận search_timeout=30 cố định, sau đó đọc src/script_chainer/services/process_manager.py để hiểu cách một tiến trình đích không tồn tại kích hoạt việc dọn dẹp. Theo dõi các đường dẫn cấu hình và trình chỉnh sửa của script bên ngoài để thêm thiết lập chỉ dành cho launcher. Công việc được hoàn thành khi timeout có thể cấu hình theo từng script, vẫn tách biệt với các timeout run và no-log, và hành vi hiện có của launcher được các bài kiểm thử bao phủ.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

问题描述

在“启动器启动”模式下,千机链寻找“启动后实际运行的程序”的超时时间固定为 30 秒,且配置界面/YAML 没有对应可调整项。

当启动器在拉起目标进程前需要先更新代码、检查依赖,或开机后网络较慢时,即使启动器仍在正常运行并持续输出日志,只要目标进程没有在 30 秒内出现,千机链就会判定启动失败、终止启动器并跳过当前脚本。

本例中受影响的是绝区零一条龙普通启动器。相同配置在更新完成后手动运行可以正常启动。

环境

  • Windows
  • OneDragon ScriptChainer v1.4.0
  • 通过 Windows 任务计划程序运行 OneDragon ScriptChainer Runner.exe --chain 01
  • 绝区零一条龙启动器 v2.4.7

脱敏后的脚本配置

script_type: external
script_path: <ZZZ_OD_DIR>\OneDragon-Launcher.exe
script_process_name:
  - python.exe
  - pythonw.exe
game_process_name: ZenlessZoneZero.exe
launcher_mode: true
run_timeout_seconds: 3600
check_done: game_or_script_closed
script_arguments: -o -c
no_log_timeout_seconds: 60
enabled: true

其中“启动后实际运行的程序”使用千机链自带的“一条龙”预设。

复现步骤

  1. 开启绝区零一条龙启动器的代码自动更新。
  2. 在千机链中按上述配置使用“启动器启动”模式。
  3. 让启动器的代码拉取/依赖检查阶段持续超过 30 秒,使 python.exe / pythonw.exe 尚未出现。
  4. 运行脚本链。

实际结果

启动器仍在正常拉取代码并输出进度,但约 30 秒时被千机链判定失败并终止。以下时间改为相对时间并已脱敏:

[T+00s] [脚本] OneDragon 启动器 v2.4.7
[T+01s] [脚本] 拉取远程代码
[T+03s] [脚本] 远程消息: 枚举对象完成
...
[T+28s] [脚本] 拉取对象约 73%
[T+30s] 脚本进程启动失败 <ZZZ_OD_DIR>\OneDragon-Launcher.exe
[T+50s] 如长时间未检测到进程,请检查“启动后实际运行的程序”填写是否正确:python.exe / pythonw.exe
[T+50s] 子进程创建失败 <ZZZ_OD_DIR>\OneDragon-Launcher.exe

该问题在多次定时运行中都稳定发生于启动约 30 秒处;同一配置在代码拉取很快完成、目标进程能在 30 秒内出现时可以启动成功,说明进程名称配置没有填错。

Image

日志

script_chainer_runner.log

预期结果

  • “启动后实际运行的程序”的搜索等待时间可以在每个外部脚本中配置;或
  • 只要启动器仍在运行且持续输出日志,就不应在固定 30 秒时直接终止;或
  • 至少将等待时间与已有的“运行超时/无日志超时”明确区分并在界面中显示。

源码定位

src/script_chainer/win_exe/script_runner.py 中固定传入 30 秒:

success = pm.open_process(
    program=script_path,
    args=args_list,
    target_process=target_process_infos,
    search_timeout=30,
    stdout_callback=_make_stdout_callback(display_name, log_notifier, state),
)

src/script_chainer/services/process_manager.py 中,目标进程未找到后会调用 self.kill() 回收启动器:

if target_process is not None:
    found = self.search_process(target_process, search_timeout)
    if not found:
        self.kill()
    return found

建议方案

建议新增每脚本配置项,例如:

startup_timeout_seconds: 120
  • 默认值可以继续保持 30 秒,以兼容现有行为。
  • 在外部程序编辑界面中,仅“启动器启动”模式显示该项。
  • 将其传给 ProcessManager.open_process(search_timeout=...)。
  • “运行超时”和“无日志超时”目前都无法影响目标进程出现前的这 30 秒,因此不能作为现有替代方案。

临时关闭绝区零一条龙的自动更新可以规避,但会失去启动时自动更新能力,不适合作为通用解决办法。

Ngôn ngữ chính
Python
Star
217
Fork
14
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Chuẩn bị môi trường

Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của OneDragon-Anything/OneDragon-ScriptChainer

Tất cả issue của OneDragon-Anything/OneDragon-ScriptChainer

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.