J’ai écrit un script batch pour déléguer à un ou plusieurs autres serveurs. Ce n’est pas aussi fluide qu’une solution intégrée, mais je pense que c’est plus proche que certains des autres scripts proposés. Il fonctionne avec un ordinateur utilisant MCEBuddy comme gestionnaire de file d’attente, qui délègue aux autres serveurs selon les besoins.
Essentiellement, il fait ceci :
- Vérifie si le serveur 1 a atteint le nombre maximum de conversions simultanées que vous avez défini pour déclencher la délégation vers un autre serveur.
- Vérifie si le serveur 2 répond et accepte les conversions.
- Vérifie si le serveur 2 est à ou en dessous du seuil que vous avez défini pour le nombre de conversions en file d’attente (et/ou si son instance MCEBuddy est inactive, si c’est la condition que vous avez définie).
- Si oui, déplace le fichier vers le dossier que vous avez défini pour ce serveur, et le retire de la file d’attente du serveur 1.
- Si non, passe au serveur 3, serveur 4, etc. jusqu’à ce qu’il trouve un serveur disponible.
- S’il finit la liste et qu’aucun autre serveur ne l’accepte, alors le serveur 1 traite le fichier comme d’habitude.
Les hypothèses suivantes s’appliquent :
- vous avez installé mcebuddy dans le répertoire par défaut sur l’ordinateur principal
- vous utilisez le port par défaut pour interagir avec le serveur
- vous copiez le code ci-dessous et le sauvegardez en tant que fichier .bat après avoir personnalisé les premières variables
- vous ajoutez une entrée « PreMetaCustomCommandPath= » au profil de conversion pour pointer vers ce fichier .bat. (Cela s’exécute par profil.)
Les limitations suivantes s’appliquent (et vous devez donc configurer ces éléments vous-même) :
- dire au serveur 2 quel répertoire surveiller
- dire au serveur 2 comment traiter le fichier ou où le placer
- dire au serveur 2 quoi faire avec le fichier original une fois terminé
- changer un serveur mcebuddy « en pause », « planifié » ou « arrêté » en « démarré »
- activer l’accès pour que le serveur 2 accède au fichier, ou pour que le serveur 1 accède au répertoire surveillé par le serveur 2
- récupérer les fichiers non traités si un serveur secondaire est arrêté après la délégation
- contourner le pare-feu Windows si vous ne l’avez pas déjà configuré
- laisser un joli journal pour MCEBuddy. MCEBuddy sur le serveur 1 considère chaque fichier transféré comme une conversion échouée.
Autres notes :
- Vous pouvez définir autant de serveurs que vous voulez dans les variables initiales (définissez le serveur, le chemin et la longueur minimale de file d’attente pour chacun) et le reste du code gérera cela.
- Il est configuré pour créer quelques fichiers texte dans votre chemin de surveillance racine. Ce n’est que parce que je ne suis pas très bon en script batch. Si quelqu’un peut améliorer mon code, qu’il le fasse ! Je peux imaginer quelques choses qui pourraient être codées plus efficacement, mais je ne suis pas assez familier (encore).
Voici ce que j’ai dans mon \config\profiles.conf sous le profil que j’utilise. Le script batch dépend au moins des cinq premiers CustomCommandParameters tels que je les ai entrés ici. Les trois autres lignes peuvent être personnalisées :
PreMetaCustomCommandPath=C:\\Shared\\MediaInfo\\Copy.bat
PreMetaCustomCommandParameters="%sourcefile%" "%relativesourcepath%" "%originalfilename%" "%originalext%" "%originalfilepath%"
PreMetaCustomCommandHangPeriod=600
PreMetaCustomCommandCritical=false
Le délai d’attente est plus que nécessaire, mais il doit être suffisamment long pour permettre la copie ou le déplacement de fichiers si vous déplacez vers un autre disque, partage, ordinateur, etc.
Et voici le script réel :
@echo off
@setlocal enableextensions enabledelayedexpansion
rem *******************************
rem **** Variables personnalisables ***
rem *******************************
rem ****** Doit remplir dans l'ordre ; ne pas sauter un numéro ******
rem ****** Chaque serveur défini doit aussi avoir un monitorpath#= et minQueue#= défini ci-dessous ******
set server1=10.1.10.141
set server2=10.1.10.108
set server3=
set server4=
rem ****** Fileserver peut être le même que la machine MCEBuddy. Il est seulement utilisé par défaut pour définir monitorpath ci-dessous. ******
rem ****** Si vous insérez des chemins absolus dans monitorpath, fileserver peut être ignoré ou laissé indéfini. ******
set fileserver=10.1.10.108
rem ****** Définissez comme vous voulez. Ceux-ci doivent être définis comme accessibles depuis le serveur 1, puisque c'est là que le script s'exécute.
rem ****** Configurez les autres serveurs pour surveiller chacun un de ces emplacements correspondant au serveur#.
rem ****** N'utilisez pas de barres obliques à la fin.
rem ****** J'ai mis les miens dans le dossier original et configuré le serveur principal pour ignorer « distributed\server* » et ses sous-dossiers, mais vous pouvez les définir chacun indépendamment, tant que chaque serveur peut accéder à son dossier.
set "monitorpath1=\\%fileserver%\F\Multimedia\Video"
set "monitorpath2=%monitorpath1%\distributed\server2"
set "monitorpath3=%monitorpath1%\distributed\server3"
set "monitorpath4=%monitorpath1%\distributed\server4"
rem ****** Définissez à 0 pour sauter ce serveur ; définissez à 1 pour utiliser seulement à l'arrêt ; ou définissez n'importe quel autre nombre.
rem ****** Le serveur 1 traitera tout jusqu'à ce que ce nombre de conversions simultanées soit atteint, puis commencera à passer au serveur suivant jusqu'à ce qu'il atteigne aussi ce nombre, et ainsi de suite.
rem ****** Le débordement reste avec le serveur 1 jusqu'à ce qu'un autre serveur tombe en dessous de son seuil.
set minQueue1=10
set minQueue2=2
set minQueue3=2
set minQueue4=2
rem *******************************
rem ******* Variables fixes ; généralement pas besoin d'ajustement *******
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 ****** Rechercher la taille de la file d'attente de chaque serveur ******
: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 ****** Vérifier si chaque serveur est « started » et comparer la longueur de la file d'attente au seuil défini. ******
rem ****** Si le serveur secondaire est « stopped », « paused » ou « scheduled », il sera ignoré. ******
rem ****** Transférer le fichier au premier serveur où les conditions sont remplies et déclencher un nouveau scan de ce serveur. ******
: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 *******pourrait aussi dire quelque chose comme : 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
Mis à jour le 19/03/2019 pour corriger certains bogues dans le script.