sciveo 0.1.60__tar.gz → 0.1.62__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. {sciveo-0.1.60 → sciveo-0.1.62}/PKG-INFO +1 -1
  2. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/cli.py +7 -2
  3. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/monitoring/watchdog/base.py +6 -5
  4. sciveo-0.1.62/sciveo/monitoring/watchdog/process.py +105 -0
  5. sciveo-0.1.62/sciveo/version.py +2 -0
  6. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo.egg-info/PKG-INFO +1 -1
  7. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo.egg-info/SOURCES.txt +1 -0
  8. sciveo-0.1.60/sciveo/version.py +0 -2
  9. {sciveo-0.1.60 → sciveo-0.1.62}/README.md +0 -0
  10. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/__init__.py +0 -0
  11. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/api/__init__.py +0 -0
  12. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/api/base.py +0 -0
  13. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/api/predictors.py +0 -0
  14. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/api/server.py +0 -0
  15. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/api/upload.py +0 -0
  16. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/common/__init__.py +0 -0
  17. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/common/configuration.py +0 -0
  18. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/common/model.py +0 -0
  19. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/common/optimizers.py +0 -0
  20. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/common/sampling.py +0 -0
  21. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/content/__init__.py +0 -0
  22. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/content/dataset.py +0 -0
  23. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/content/experiment.py +0 -0
  24. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/content/project.py +0 -0
  25. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/content/runner.py +0 -0
  26. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/__init__.py +0 -0
  27. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/capture/__init__.py +0 -0
  28. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/capture/cam.py +0 -0
  29. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/capture/nvr.py +0 -0
  30. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/__init__.py +0 -0
  31. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/base.py +0 -0
  32. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/encoders/__init__.py +0 -0
  33. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/encoders/base.py +0 -0
  34. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/encoders/normalizer.py +0 -0
  35. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/nlp/__init__.py +0 -0
  36. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/nlp/search.py +0 -0
  37. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/time_series/__init__.py +0 -0
  38. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/time_series/dataset.py +0 -0
  39. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/time_series/predictor.py +0 -0
  40. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/time_series/trainer.py +0 -0
  41. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/ml/time_series/window_generator.py +0 -0
  42. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/__init__.py +0 -0
  43. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/base.py +0 -0
  44. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/job_daemon.py +0 -0
  45. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/layouts/__init__.py +0 -0
  46. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/layouts/base.py +0 -0
  47. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/pipeline.py +0 -0
  48. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/postprocessors/__init__.py +0 -0
  49. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/postprocessors/base.py +0 -0
  50. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/postprocessors/default.py +0 -0
  51. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/__init__.py +0 -0
  52. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/audio/__init__.py +0 -0
  53. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/audio/audio.py +0 -0
  54. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/audio/audio_extractor_process.py +0 -0
  55. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/aws.py +0 -0
  56. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/base.py +0 -0
  57. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/file/__init__.py +0 -0
  58. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/file/archive.py +0 -0
  59. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/__init__.py +0 -0
  60. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/album.py +0 -0
  61. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/album_in_image.py +0 -0
  62. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/depth_esimation.py +0 -0
  63. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/embeddings.py +0 -0
  64. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/filters.py +0 -0
  65. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/generators.py +0 -0
  66. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/histogram.py +0 -0
  67. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/mask.py +0 -0
  68. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/object_detection.py +0 -0
  69. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/resize.py +0 -0
  70. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/segmentation.py +0 -0
  71. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/image/watermark.py +0 -0
  72. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/media_info.py +0 -0
  73. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/nlp/__init__.py +0 -0
  74. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/nlp/address.py +0 -0
  75. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/qr.py +0 -0
  76. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/sci/__init__.py +0 -0
  77. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/sci/base.py +0 -0
  78. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/sci/dataset.py +0 -0
  79. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/sci/time_series/__init__.py +0 -0
  80. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/sci/time_series/predictor.py +0 -0
  81. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/sci/time_series/trainer.py +0 -0
  82. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/tpu_base.py +0 -0
  83. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/video/__init__.py +0 -0
  84. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/video/generators.py +0 -0
  85. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/video/motion_detection.py +0 -0
  86. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/video/resize.py +0 -0
  87. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/video/video_album.py +0 -0
  88. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/video/video_frames.py +0 -0
  89. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/processors/video/video_resample.py +0 -0
  90. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/queues.py +0 -0
  91. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/server.py +0 -0
  92. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/web/__init__.py +0 -0
  93. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/pipelines/web/server.py +0 -0
  94. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/tools/__init__.py +0 -0
  95. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/media/tools/video_interactive.py +0 -0
  96. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/__init__.py +0 -0
  97. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/base.py +0 -0
  98. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/dataset/__init__.py +0 -0
  99. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/dataset/object_detection.py +0 -0
  100. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/evaluation/__init__.py +0 -0
  101. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/evaluation/markdown.py +0 -0
  102. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/evaluation/object_detection.py +0 -0
  103. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/images/__init__.py +0 -0
  104. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/images/base.py +0 -0
  105. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/images/description.py +0 -0
  106. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/images/embeddings.py +0 -0
  107. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/images/object_detection.py +0 -0
  108. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/images/tools.py +0 -0
  109. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/images/transformers.py +0 -0
  110. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/nlp/__init__.py +0 -0
  111. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/nlp/embeddings.py +0 -0
  112. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/nlp/tokenizers/__init__.py +0 -0
  113. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/nlp/tokenizers/bpe.py +0 -0
  114. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/video/__init__.py +0 -0
  115. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/ml/video/description.py +0 -0
  116. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/monitoring/__init__.py +0 -0
  117. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/monitoring/monitor.py +0 -0
  118. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/monitoring/start.py +0 -0
  119. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/monitoring/watchdog/__init__.py +0 -0
  120. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/network/__init__.py +0 -0
  121. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/network/camera.py +0 -0
  122. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/network/sniffer.py +0 -0
  123. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/network/tools.py +0 -0
  124. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/__init__.py +0 -0
  125. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/array.py +0 -0
  126. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/aws/__init__.py +0 -0
  127. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/aws/priority_queue.py +0 -0
  128. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/aws/s3.py +0 -0
  129. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/common.py +0 -0
  130. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/complexity.py +0 -0
  131. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/compress.py +0 -0
  132. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/configuration.py +0 -0
  133. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/crypto.py +0 -0
  134. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/daemon.py +0 -0
  135. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/draw/__init__.py +0 -0
  136. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/draw/contours.py +0 -0
  137. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/formating.py +0 -0
  138. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/hardware.py +0 -0
  139. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/http.py +0 -0
  140. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/logger.py +0 -0
  141. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/os.py +0 -0
  142. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/queue.py +0 -0
  143. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/random.py +0 -0
  144. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/remote.py +0 -0
  145. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/simple_counter.py +0 -0
  146. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/synchronized.py +0 -0
  147. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo/tools/timers.py +0 -0
  148. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo.egg-info/dependency_links.txt +0 -0
  149. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo.egg-info/entry_points.txt +0 -0
  150. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo.egg-info/requires.txt +0 -0
  151. {sciveo-0.1.60 → sciveo-0.1.62}/sciveo.egg-info/top_level.txt +0 -0
  152. {sciveo-0.1.60 → sciveo-0.1.62}/setup.cfg +0 -0
  153. {sciveo-0.1.60 → sciveo-0.1.62}/setup.py +0 -0
  154. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_complexity.py +0 -0
  155. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_compress.py +0 -0
  156. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_configuration.py +0 -0
  157. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_crypto.py +0 -0
  158. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_eval_markdown.py +0 -0
  159. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_ml_datasets.py +0 -0
  160. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_monitoring.py +0 -0
  161. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_runner.py +0 -0
  162. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_sampling.py +0 -0
  163. {sciveo-0.1.60 → sciveo-0.1.62}/test/test_tokenizers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sciveo
3
- Version: 0.1.60
3
+ Version: 0.1.62
4
4
  Description-Content-Type: text/markdown
5
5
  Provides-Extra: mon
6
6
  Provides-Extra: net
@@ -51,8 +51,9 @@ def main():
51
51
  parser.add_argument('--src', type=str, default=None, help='Source')
52
52
  parser.add_argument('--dst', type=str, default=None, help='Destination')
53
53
  parser.add_argument('--value', type=float, help='Value')
54
- parser.add_argument('--threshold', type=float, help='Threshold')
54
+ parser.add_argument('--threshold', type=float, default=None, help='Threshold')
55
55
  parser.add_argument('--execute', type=str, default=None, help='Execute command')
56
+ parser.add_argument('--pid', type=int, default=None, help='Process PID')
56
57
 
57
58
  args = parser.parse_args()
58
59
 
@@ -93,13 +94,17 @@ def main():
93
94
  from sciveo.media.pipelines.processors.audio.audio_extractor_process import plot_audio
94
95
  plot_audio(args.width, args.height, args.rate, args.input_path, args.output_path)
95
96
  elif args.command == 'watchdog':
96
- from sciveo.monitoring.watchdog.base import MemoryWatchDogDaemon, DiskWatchDogDaemon
97
97
  daemons = []
98
98
  if args.execute is not None:
99
99
  if args.src is None or args.src.startswith("mem"):
100
+ from sciveo.monitoring.watchdog.base import MemoryWatchDogDaemon
100
101
  daemons.append(MemoryWatchDogDaemon(threshold_percent=args.threshold, period=args.period, command=args.execute))
101
102
  elif args.src.startswith("disk") and args.input_path is not None:
103
+ from sciveo.monitoring.watchdog.base import DiskWatchDogDaemon
102
104
  daemons.append(DiskWatchDogDaemon(path=args.input_path, threshold_percent=args.threshold, period=args.period, command=args.execute))
105
+ elif args.src.startswith("process"):
106
+ from sciveo.monitoring.watchdog.process import ProcessWatchDogDaemon
107
+ daemons.append(ProcessWatchDogDaemon(pid=args.pid, process_cmd=args.dst, period=args.period, command=args.execute, thread_inactive_threshold=args.threshold))
103
108
  for daemon in daemons:
104
109
  daemon.start()
105
110
  while(True):
@@ -19,23 +19,24 @@ from sciveo.tools.simple_counter import RunCounter
19
19
 
20
20
 
21
21
  class BaseWatchDogDaemon(DaemonBase):
22
- def __init__(self, threshold_percent=90, period=5, command="echo '⚠️'", monitored="none"):
22
+ def __init__(self, threshold_percent=90, period=5, command="echo '⚠️'", monitored="none", monitor_value="usage"):
23
23
  super().__init__(period=period)
24
24
  self.threshold_percent = threshold_percent
25
25
  self.command = command
26
26
  self.used_percent = 0
27
27
  self.monitored = monitored
28
- self.printer = RunCounter(60, lambda: debug(f"{self.monitored} usage: {self.used_percent}%", f"threshold: {self.threshold_percent}%"))
28
+ self.monitor_value = monitor_value
29
+ self.printer = RunCounter(60, lambda: debug(f"{self.monitored} {self.monitor_value}: {self.used_percent}%", f"threshold: {self.threshold_percent}%"))
29
30
 
30
- def get_used_percent(self):
31
- return 0.0
31
+ def value(self):
32
+ return {"percent": 0.0}
32
33
 
33
34
  def loop(self):
34
35
  current_value = self.value()
35
36
  self.used_percent = current_value["percent"]
36
37
  self.printer.run()
37
38
  if self.used_percent > self.threshold_percent:
38
- warning(f"⚠️ {self.monitored} usage {self.used_percent}% exceeded {self.threshold_percent}%, executing command: {self.command}")
39
+ warning(f"⚠️ {self.monitored} {self.monitor_value} {self.used_percent}% exceeded {self.threshold_percent}%, executing command: {self.command}")
39
40
  subprocess.run(self.command, shell=True)
40
41
 
41
42
 
@@ -0,0 +1,105 @@
1
+ #
2
+ # Pavlin Georgiev, Softel Labs
3
+ #
4
+ # This is a proprietary file and may not be copied,
5
+ # distributed, or modified without express permission
6
+ # from the owner. For licensing inquiries, please
7
+ # contact pavlin@softel.bg.
8
+ #
9
+ # 2025
10
+ #
11
+
12
+ import time
13
+ import psutil
14
+
15
+ from sciveo.tools.logger import *
16
+ from sciveo.monitoring.watchdog.base import BaseWatchDogDaemon
17
+
18
+
19
+ class ProcessWatchDogDaemon(BaseWatchDogDaemon):
20
+ def __init__(self, pid=None, process_cmd=None, period=5, command="echo '⚠️ process error!'", thread_inactive_threshold=None):
21
+ self.process_cmd = process_cmd
22
+ self.info_threads = {}
23
+ self.thread_inactive_threshold = thread_inactive_threshold
24
+ super().__init__(threshold_percent=10, period=period, command=command, monitored="Process", monitor_value="is dead")
25
+
26
+ self.this_pid = psutil.Process().pid
27
+ self.pids = self.get_pids_by_cmd()
28
+ if pid is not None:
29
+ self.pids.append(pid)
30
+
31
+ def get_pids_by_cmd(self):
32
+ matched_pids = []
33
+ if self.process_cmd is not None:
34
+ for proc in psutil.process_iter(attrs=["pid", "cmdline"]):
35
+ if proc.info["pid"] == self.this_pid:
36
+ continue
37
+ try:
38
+ cmdline = " ".join(proc.info["cmdline"])
39
+ if self.process_cmd in cmdline:
40
+ matched_pids.append(proc.info["pid"])
41
+ except Exception:
42
+ continue
43
+ info(f"processes matching [{self.process_cmd}]", matched_pids)
44
+ return matched_pids
45
+
46
+ def get_threads(self, process):
47
+ current_time = time.time()
48
+ for t in process.threads():
49
+ cpu_time = t.user_time + t.system_time
50
+ if t.id not in self.info_threads:
51
+ self.info_threads[t.id] = {
52
+ "id": t.id,
53
+ "start_at": current_time,
54
+ "last_active": current_time,
55
+ "last_cpu": cpu_time
56
+ }
57
+ else:
58
+ if cpu_time != self.info_threads[t.id]["last_cpu"]:
59
+ self.info_threads[t.id]["last_active"] = current_time
60
+ self.info_threads[t.id]["last_cpu"] = cpu_time
61
+
62
+ def check_threads(self, pid):
63
+ current_time = time.time()
64
+ for tid, thr in self.info_threads.items():
65
+ elapsed_time = int(current_time - thr["last_active"])
66
+ if elapsed_time > self.thread_inactive_threshold:
67
+ warning(f"⚠️ process[{pid}] thread[{tid}] inactive for {elapsed_time}s.")
68
+
69
+ def process_value(self, pid):
70
+ try:
71
+ p = psutil.Process(pid)
72
+ if p.is_running():
73
+ if p.status() != psutil.STATUS_ZOMBIE:
74
+
75
+ if self.thread_inactive_threshold is not None:
76
+ try:
77
+ self.get_threads(p)
78
+ self.check_threads(pid)
79
+ except psutil.NoSuchProcess as e:
80
+ exception(e, pid)
81
+
82
+ return 0
83
+ else:
84
+ return 50
85
+ except psutil.NoSuchProcess:
86
+ pass
87
+ return 100
88
+
89
+ def value(self):
90
+ pv = 0.0
91
+ for pid in self.pids:
92
+ pv += self.process_value(pid)
93
+ return {"percent": pv}
94
+
95
+
96
+ if __name__ == '__main__':
97
+ daemons = [
98
+ ProcessWatchDogDaemon(pid=87443, thread_inactive_threshold=10),
99
+ ProcessWatchDogDaemon(process_cmd="sciveo monitor", thread_inactive_threshold=10),
100
+ ]
101
+ for d in daemons:
102
+ d.start()
103
+
104
+ while(True):
105
+ time.sleep(30)
@@ -0,0 +1,2 @@
1
+
2
+ __version__ = '0.1.62'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sciveo
3
- Version: 0.1.60
3
+ Version: 0.1.62
4
4
  Description-Content-Type: text/markdown
5
5
  Provides-Extra: mon
6
6
  Provides-Extra: net
@@ -119,6 +119,7 @@ sciveo/monitoring/monitor.py
119
119
  sciveo/monitoring/start.py
120
120
  sciveo/monitoring/watchdog/__init__.py
121
121
  sciveo/monitoring/watchdog/base.py
122
+ sciveo/monitoring/watchdog/process.py
122
123
  sciveo/network/__init__.py
123
124
  sciveo/network/camera.py
124
125
  sciveo/network/sniffer.py
@@ -1,2 +0,0 @@
1
-
2
- __version__ = '0.1.60'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes