我有多台安裝 MCEBuddy 的系統(目前是一台主電腦與一台 DVR 伺服器,未來若你實作此功能,可能還會更多)。我希望看到能讓這些系統分擔工作量的選項,讓目前沒有排程任務的系統,能接手另一台 MCEBuddy 安裝的佇列。
我知道這可能需要一些配套措施,但如果其中一台安裝負責複製並轉送檔案到另一台安裝,應該就能避開部分權限問題。這「應該」要求兩端安裝都必須被授權彼此協作(也許用藍牙術語來說就是「配對」),而且完成後的檔案還得傳回原始系統,並依照原始系統的設定放置。
顯然,在任務完成並歸還前,不該從佇列移除;而正由另一系統處理的項目,應在佇列中暫停,直到輔助系統斷線 X 時間後,或手動啟用,才會繼續。或許甚至可以設定一個最小佇列長度,超過才開始卸載任務……
然而,鑑於 MCEBuddy 系統的高度可自訂性,我認為你應該能讓第二套安裝,依據發起者的設定,使用第二套系統的資源來處理檔案。我建議硬體設定應綁定各自系統,因為並非所有系統規格都相同;但能讓我的主電腦選擇把 DVR 系統的部分佇列卸載過來,會很有幫助……
在 MCEBuddy 狀態面板上,需要有一個「允許佇列協助」的按鈕。只有當系統自身的佇列為空時,此功能才會啟用。
簡單說,我想要一種方式:按個按鈕,就能讓第二系統依照原始系統的指示進行轉碼,藉此分擔沉重的 DVR 負載,並透過額外系統的協助,彌補較弱或較舊系統的限制……
目前的情況是,檔案必須先從原始系統搬離,再手動搬到第二系統才能接手,這相當沒效率,還增加了可能損毀的環節……
我写了一个批处理脚本来将任务卸载到另一台或多台服务器。虽然它不像集成解决方案那样顺畅,但我认为它比其他一些提议的脚本更接近。它使用一台装有 MCEBuddy 作为队列管理器的计算机,根据需要将其分发到其他服务器。
本质上,它的工作流程如下:
- 检查服务器 1 是否已达到你设定的并发转换阈值,以触发卸载到另一台服务器。
- 检查服务器 2 是否响应并愿意接收转换任务。
- 检查服务器 2 的队列是否低于你设定的阈值(或如果你设定为空闲状态)。
- 如果是,将文件移动到你为该服务器定义的文件夹,并从服务器 1 的队列中移除。
- 如果不是,继续检查服务器 3、服务器 4 等,直到找到可用服务器。
- 如果遍历完列表后没有其他服务器接受,则服务器 1 照常处理该文件。
以下假设适用:
- 你在主计算机的默认目录中安装了 mcebuddy
- 你使用默认端口与服务器交互
- 你复制下面的代码并将其保存为 .bat 文件,并在自定义初始几个变量后
- 你在转换配置文件中添加一个 “PreMetaCustomCommandPath=” 条目指向这个 .bat 文件。(这是按配置文件运行的。)
以下限制适用(因此你必须自己配置这些内容):
- 告诉服务器 2 要监控哪个目录
- 告诉服务器 2 如何处理文件或将其放在哪里
- 告诉服务器 2 完成后对原始文件做什么
- 将“暂停”、“计划”或“停止”的 mcebuddy 服务器更改为“启动”
- 启用服务器 2 访问文件,或服务器 1 访问服务器 2 监控的目录
- 如果辅助服务器在移交后停止,检索未处理的文件
- 如果你尚未配置,绕过 Windows 防火墙
- 为 MCEbuddy 留下漂亮的日志。服务器 1 上的 MCEBuddy 将每个传输的文件视为转换失败。
其他说明:
- 你可以在初始变量中定义任意数量的服务器(设置服务器、路径和每个的最小队列长度),其余代码将自动处理。
- 它会在你的根监控路径中创建一些文本文件。这只是因为我不太擅长批处理脚本。如果有人能改进我的代码,请随意!我可以想象有几件事可以更高效地编码,但我不太熟悉(还)。
这是我在 \config\profiles.conf 中使用的配置,位于我正在使用的配置文件下。批处理脚本至少依赖于前五个 CustomCommandParameters 与我输入的内容一致。其他三行你可以自定义:
PreMetaCustomCommandPath=C:\Shared\MediaInfo\Copy.bat
PreMetaCustomCommandParameters="%sourcefile%" "%relativesourcepath%" "%originalfilename%" "%originalext%" "%originalfilepath%"
PreMetaCustomCommandHangPeriod=600
PreMetaCustomCommandCritical=false
挂起时间比需要的要长,但它需要足够长,以允许在不同驱动器、共享、计算机等之间复制或移动文件。
以下是实际脚本:
@echo off
@setlocal enableextensions enabledelayedexpansion
rem *******************************
rem **** Customizable variables ***
rem *******************************
rem ****** Must fill in order; don't skip a number ******
rem ****** Each defined server must also have a defined monitorpath#= and minQueue#= below
set server1=10.1.10.141
set server2=10.1.10.108
set server3=
set server4=
rem ****** Fileserver can be same as MCEBuddy machine. It's only used by default to define monitorpath below.
rem ****** If you insert absolute paths in monitorpath, fileserver can be ignored or left undefined. ******
set fileserver=10.1.10.108
rem ****** Set to whatever you'd like. These should be defined as accessed from server 1, since that is where the script is running.
rem ****** Configure the other server(s) to each monitor one of these locations corresponding to the server#.
rem ****** Don't use slashes at the end.
rem ****** I put mine inside the original folder and set the primary server to ignore "distributed\server*" and its subfolders, but you can define them each independently, as long as each server can access its folder.
set "monitorpath1=\\%fileserver%\F\Multimedia\Video"
set "monitorpath2=%monitorpath1%\distributed\server2"
set "monitorpath3=%monitorpath1%\distributed\server3"
set "monitorpath4=%monitorpath1%\distributed\server4"
rem ****** Set to 0 to skip that server; set to 1 to use only when idle; or set any other number.
rem ****** Server 1 will process all until this number of concurrent conversions is met, then start passing to next server until it too reaches this number, and so on.
rem ****** Overflow stays with server 1 until another server falls below its threshold.
set minQueue1=10
set minQueue2=2
set minQueue3=2
set minQueue4=2
rem *******************************
rem ******* Fixed variables; generally don't need adjusting *******
rem *******************************
set relativesourcepath=%2
set relativesourcepath=%relativesourcepath:"=%
set filename=%3.%4
set filename=%filename:"=%
set absolutesourcepath=%5
set absolutesourcepath=%absolutesourcepath:"=%
set servernumber=1
set fail=0
rem ****** Look up size of queue of each server ******
:queueLookup
"C:\Program Files\MCEBuddy2x\mcebuddy.usercli.exe" --command=query --action=queuelength --server=!server%servernumber%! >"%monitorpath1%\queue!servernumber!.txt"
findstr /C:"queue = " "%monitorpath1%\queue!servernumber!.txt">"%monitorpath1%\queue!servernumber!a.txt"
move /y "%monitorpath1%\queue!servernumber!a.txt" "%monitorpath1%\queue!servernumber!.txt"
set /p queue!servernumber!=<"%monitorpath1%\queue!servernumber!.txt"
set "queue!servernumber!=!queue%servernumber%:~-1!
if "!queue%servernumber%!"=="~-1" (
set queue!servernumber!=
set /a fail=fail+1
if !fail! EQU 3 goto:skip
SET /A rdm=%RANDOM% * 5 / 32768 + 1
timeout !rdm!
goto:queueLookup
)
:skip
set fail=0
set /a servernumber=servernumber+1
if defined server!servernumber! (
goto:queueLookup
) else (
set servernumber=1
goto:queueCompare
)
rem ****** Check if each server is "started" and compare queue length to defined threshold. ******
rem ****** If secondary server is "stopped", "paused", or "scheduled" it will be skipped. ******
rem ****** Transfer file to first server where conditions are met and trigger rescan of that server. ******
:queueCompare
if !servernumber!==1 (
if !queue%servernumber%! LEQ !minQueue%servernumber%! (
if !minQueue%servernumber%! GEQ 1 goto:ending
)
)
set /a servernumber=servernumber+1
if defined server!servernumber! (
goto:nextserver
) else (
goto:ending
)
:nextserver
"C:\Program Files\MCEBuddy2x\mcebuddy.usercli.exe" --command=query --action=enginestate --server=!server%servernumber%!>"%monitorpath1%\status!servernumber!.txt"
set "Server!servernumber!Status="
findstr /C:"started" "%monitorpath1%\status!servernumber!.txt"
if "%ERRORLEVEL%"=="0" set Server!servernumber!Status=1
findstr /C:"progress" "%monitorpath1%\status!servernumber!.txt"
if "%ERRORLEVEL%"=="0" set Server!servernumber!Status=1
if defined Server!servernumber!Status (
if !minQueue%servernumber%! GTR !queue%servernumber%! (
rem *******could also say something like: if !queue%servernumber%! LEQ !queue1!
md "!monitorpath%servernumber%!\%relativesourcepath%" 2>nul
move /y %1 "!monitorpath%servernumber%!\%relativesourcepath%\%filename%"
"C:\Program Files\MCEBuddy2x\mcebuddy.usercli.exe" --command=engine --action=rescan --server=!server%servernumber%!
goto:ending
) else (
goto:queueCompare
)
)
:ending
2019年3月19日更新,修复了脚本中的一些错误。