HTOPServerFileEntryInCMD = "--htop-of-servers"
HTOPFileTimeResEntryInCMD = "--htop-of-yacs-engine-process-time-res"
HTOPServerFileTimeResEntryInCMD = "--htop-of-servers-time-res"
+MonitoringDirsEntryInCMD = "--monitoring-dirs-content"
+MonitoringDirsResEntryInCMD = "--monitoring-dirs-content-res"
+MonitoringDirsTimeResEntryInCMD = "--monitoring-dirs-content-time-res"
DisplayKeyInARGS = "display"
VerboseKeyInARGS = "verbose"
HTOPServerFileKeyInARGS = "htop_of_servers"
HTOPFileTimeResKeyInARGS = "htop_of_yacs_engine_process_time_res"
HTOPServerFileTimeResKeyInARGS = "htop_of_servers_time_res"
+MonitoringDirsInARGS = "monitoring_dirs_content"
+MonitoringDirsResInARGS = "monitoring_dirs_content_res"
+MonitoringDirsTimeResInARGS = "monitoring_dirs_content_time_res"
KeyValnARGS = [(DisplayEntryInCMD,DisplayKeyInARGS),
(VerboseEntryInCMD,VerboseKeyInARGS),
(HTOPFileTimeResEntryInCMD,HTOPFileTimeResKeyInARGS),
(HTOPServerFileEntryInCMD,HTOPServerFileKeyInARGS),
(HTOPServerFileTimeResEntryInCMD,HTOPServerFileTimeResKeyInARGS),
+ (MonitoringDirsEntryInCMD,MonitoringDirsInARGS),
+ (MonitoringDirsResEntryInCMD,MonitoringDirsResInARGS),
+ (MonitoringDirsTimeResEntryInCMD,MonitoringDirsTimeResInARGS),
(IOREntryInCMD,IORKeyInARGS)]
my_runtime_yacs = None
@SALOMEInitializationNeeded
def executeGraph( executor, xmlfilename, proc, dump, finalDump, display, CPUMemContainerTimeRes,
HTopOfThisProcessFile, HTopTimeRes,
- HTopOfAllServersFile, HTopOfAllServersTimeRes):
+ HTopOfAllServersFile, HTopOfAllServersTimeRes, DirectoriesToMonitor):
"""
Args:
-----
dump_thread = None
import pilot
import os
+ import contextlib
+
+ def MonitoringDirectories( DirectoriesToMonitor ):
+ import SALOME_PyNode
+ if len( DirectoriesToMonitor ) > 0:
+ return [ SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.FileSystemMonitoring(timeRes*1000,zeDir,zeDirRes) ) for zeDir,zeDirRes,timeRes in DirectoriesToMonitor ]
+ else:
+ return [ contextlib.nullcontext() ]
def MonitoringThisProcess(HTopOfThisProcessFile,HTopTimeRes):
import SALOME_PyNode
- import contextlib
if HTopOfThisProcessFile:
return SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.CPUMemoryMonitoring(1000*HTopTimeRes,HTopOfThisProcessFile) )
else:
return contextlib.nullcontext()
+
def MonitoringAllKernelServers(HTopOfAllServersFile, HTopOfAllServersTimeRes):
- import contextlib
if HTopOfAllServersFile:
return salome.LogManagerLaunchMonitoringFileCtxMgr( 1000*HTopOfAllServersTimeRes, HTopOfAllServersFile )
else:
#
salome.cm.SetDeltaTimeBetweenCPUMemMeasureInMilliSecond( 1000*CPUMemContainerTimeRes )
#
- with MonitoringThisProcess(HTopOfThisProcessFile, HTopTimeRes) as monitoringParamsMaster:
- with MonitoringAllKernelServers(HTopOfAllServersFile, HTopOfAllServersTimeRes) as monitoringParams:
- executor.RunPy(proc,display,isPyThread=True,fromscratch=True) # same as RunW but releasing GIL
+ ctxManagers = MonitoringDirectories( DirectoriesToMonitor ) + [ MonitoringThisProcess(HTopOfThisProcessFile, HTopTimeRes) ] + [ MonitoringAllKernelServers(HTopOfAllServersFile, HTopOfAllServersTimeRes) ]
+ with contextlib.ExitStack() as stack:
+ for mgr in ctxManagers:
+ stack.enter_context(mgr)
+ executor.RunPy(proc,display,isPyThread=True,fromscratch=True) # same as RunW but releasing GIL
if proc.getEffectiveState() != pilot.DONE:
raise RuntimeError( proc.getErrorReport() )
#
parser.add_argument(HTOPFileTimeResEntryInCMD, dest = HTOPFileTimeResKeyInARGS, type=int, default = 60, help="Time in second between between two measures of CPU/Mem of current process")
parser.add_argument(HTOPServerFileEntryInCMD, dest = HTOPServerFileKeyInARGS, type=str, default ="", help="File name (if not empty) containing the result of measure of all server processes")
parser.add_argument(HTOPServerFileTimeResEntryInCMD, dest = HTOPServerFileTimeResKeyInARGS, type=int, default = 30, help="Time in second between between two measures of CPU/Mem of any server process")
+ parser.add_argument(MonitoringDirsEntryInCMD, dest = MonitoringDirsInARGS, nargs='+', type=str, default =[], help="List of directories to be monitored")
+ parser.add_argument(MonitoringDirsResEntryInCMD, dest = MonitoringDirsResInARGS, nargs='+', type=str, default =[], help=f"List of files with result of monitoring of directories to be monitored (see {MonitoringDirsInARGS}). The size of lists are expected to be the same.")
+ parser.add_argument(MonitoringDirsTimeResEntryInCMD, dest = MonitoringDirsTimeResInARGS, nargs='+', type=int, default =[], help=f"List of time resolution (in second) of monitoring of directories to be monitored (see {MonitoringDirsInARGS}). The size of lists are expected to be the same.")
parser.add_argument(IOREntryInCMD, dest = IORKeyInARGS, type=str, default ="", help="file inside which the ior of NS will be stored")
parser.add_argument("--options_from_json", dest = "options_from_json", type=str, default ="", help="Json file of options. If defined options in json will override those specified in command line.")
return parser
#
executeGraph( executor, xmlFileName, proc, args[DumpKeyInARGS], args[DumpStateKeyInARGS], args[DisplayKeyInARGS], args[CPUTimeResOfContainerKeyInARGS],
args[HTOPFileKeyInARGS], args[HTOPFileTimeResKeyInARGS],
- args[HTOPServerFileKeyInARGS], args[HTOPServerFileTimeResKeyInARGS])
+ args[HTOPServerFileKeyInARGS], args[HTOPServerFileTimeResKeyInARGS], [(dirToMonitor,resFile,timeRes) for dirToMonitor,resFile,timeRes in zip(args[MonitoringDirsInARGS],args[MonitoringDirsResInARGS],args[MonitoringDirsTimeResInARGS])] )
#
destroyElementsGeneratedByExecutionOfGraph( proc, args[ShutdownKeyInARGS] )