ladyrick 0.5.5__py3-none-any.whl → 0.5.6__py3-none-any.whl

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.
ladyrick/cli/multi_ssh.py CHANGED
@@ -52,14 +52,14 @@ def remote_head():
52
52
  def handle_signal(sig, frame=None):
53
53
  if sig == signal.SIGUSR2:
54
54
  # SIGUSR2 trigger force_kill manually
55
- print("SIGUSR2 received. force kill")
55
+ log("SIGUSR2 received. force kill")
56
56
  force_kill(child, child_pgid)
57
57
  else:
58
- print(f"forward signal {sig} to {child.pid}")
58
+ log(f"forward signal {sig} to {child.pid}")
59
59
  try:
60
60
  os.kill(child.pid, sig)
61
61
  except ProcessLookupError as e:
62
- print(str(e))
62
+ log(str(e))
63
63
 
64
64
  for sig in [signal.SIGHUP, signal.SIGINT, signal.SIGTERM, signal.SIGUSR1, signal.SIGUSR2]:
65
65
  signal.signal(sig, handle_signal)
@@ -202,12 +202,17 @@ class RemoteExecutor:
202
202
  except (BrokenPipeError, OSError) as e:
203
203
  log(e)
204
204
 
205
+ def terminate(self):
206
+ if self.process is not None and self.process.poll() is None:
207
+ log("terminate RemoteExecutor")
208
+ self.process.terminate()
209
+
205
210
  def poll(self):
206
211
  assert self.process is not None
207
212
  return self.process.poll()
208
213
 
209
214
 
210
- def signal_repeat_checker(sig_to_check, count, duration):
215
+ def signal_repeat_checker(sig_to_check, duration: float):
211
216
  last_int_signal_time = []
212
217
 
213
218
  def checker(sig: signal.Signals):
@@ -217,11 +222,8 @@ def signal_repeat_checker(sig_to_check, count, duration):
217
222
  threadhold = cur_time - duration
218
223
  last_int_signal_time = [t for t in last_int_signal_time if t >= threadhold]
219
224
  last_int_signal_time.append(cur_time)
220
-
221
- if len(last_int_signal_time) >= count:
222
- log(f"received {sig_to_check.name} for {count} times or more in {duration} second(s)")
223
- return True
224
- return False
225
+ return len(last_int_signal_time)
226
+ return 0
225
227
 
226
228
  return checker
227
229
 
@@ -290,16 +292,27 @@ def main():
290
292
  for executor in executors:
291
293
  executor.start()
292
294
 
293
- checker = signal_repeat_checker(signal.SIGINT, count=3, duration=1)
295
+ import rich
296
+
297
+ checker = signal_repeat_checker(signal.SIGINT, duration=1)
294
298
 
295
299
  def handle_signal(sig, frame):
296
- if checker(sig):
300
+ log(f"received signal {sig}")
301
+ sig_count = checker(sig)
302
+ if sig_count >= 3:
297
303
  sig = signal.SIGUSR2
298
- log("\nTry to froce kill remote processes")
304
+ if sig_count == 3:
305
+ rich.print("\n[bold magenta]Can't wait. Try to froce kill remote processes...[/bold magenta]")
299
306
  else:
300
- log(f"\nReceived {signal.Signals(sig).name}, forwarding...")
307
+ rich.print(
308
+ f"\n[bold green]Received {signal.Signals(sig).name}, forwarding to remote processes...[/bold green]"
309
+ )
301
310
  for executor in executors:
302
311
  executor.send_signal(sig)
312
+ if sig_count >= 4:
313
+ rich.print("\n[bold red]Really Can't wait!!! Froce kill local processes and exiting right now![/bold red]")
314
+ for executor in executors:
315
+ executor.terminate()
303
316
 
304
317
  for sig in [signal.SIGHUP, signal.SIGINT, signal.SIGTERM, signal.SIGUSR1, signal.SIGUSR2]:
305
318
  signal.signal(sig, handle_signal)
@@ -5,8 +5,8 @@ import time
5
5
 
6
6
  def handle_signal(sig, frame):
7
7
  print(f"received signal {sig}, {signal.Signals(sig).name}", flush=True)
8
- # if sig in {signal.SIGTERM, signal.SIGINT, signal.SIGHUP}:
9
- # sys.exit(0)
8
+ if sig in {signal.SIGTERM, signal.SIGINT, signal.SIGHUP}:
9
+ sys.exit(0)
10
10
 
11
11
 
12
12
  for sig in [s for s in vars(signal).values() if isinstance(s, signal.Signals)]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ladyrick
3
- Version: 0.5.5
3
+ Version: 0.5.6
4
4
  Summary: ladyrick's tools
5
5
  Author-email: ladyrick <ladyrick@qq.com>
6
6
  License-Expression: MIT
@@ -10,20 +10,20 @@ ladyrick/typing.py,sha256=YQeApe63dk7yL4NS5ytlR6v3dLCii2-qsXNlUvjK-zw,203
10
10
  ladyrick/utils.py,sha256=jRRaqC6kNbCJPGeE0YisFgis-wiuINLik1mcUQtytow,608
11
11
  ladyrick/vars.py,sha256=VbFh2u7XybUaBuiYEXBa4sOmoS99vc2AIXdYLBh8vjk,3763
12
12
  ladyrick/cli/calc.py,sha256=5_UhSSaL_K9FBCHg3zuCk41CHJXy3QAh__qCabbffQY,1438
13
- ladyrick/cli/multi_ssh.py,sha256=02DmcotlKGlaAEIgIi5KsnjBxkNnf60OiimpH20JfYU,9903
13
+ ladyrick/cli/multi_ssh.py,sha256=d_7zPvmfVUQZVcxhCFj37ktTOb0-AzxSEr0z6ipMY9U,10403
14
14
  ladyrick/cli/psf.py,sha256=JLk3gbPn7E3uuPBbzGvLgJmFQlilA6zg_Xlg7xW5jik,1146
15
15
  ladyrick/cli/tee.py,sha256=UMJxSJLOEfbV43auVKRTIJ5ZAMAkAfj8byiFLk5PUHE,3579
16
16
  ladyrick/cli/test_args.py,sha256=f5sUPDlcf6nbNf6UfLwZQI5g5LN8wlFBQZ10GLw22cg,212
17
- ladyrick/cli/test_signal.py,sha256=zGPGMR81j1_vNyGEAcRtO2WjhDXiCj2xHMDATk-Z33M,494
17
+ ladyrick/cli/test_signal.py,sha256=uvVLbHlvpmYgZcfRF9Lcte0OJJrMDDsmId3BpSxeaOA,490
18
18
  ladyrick/patch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  ladyrick/patch/print.py,sha256=Ks_ONpeLOyC9pFKLmAiNliwGPbJyt9qz-cnRUPVto34,845
20
20
  ladyrick/patch/rich_print.py,sha256=z3Ea1VCunXZvNvEDFHpoyWc8ydINmh-gOIJ1ssscs6s,841
21
21
  ladyrick/patch/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  ladyrick/patch/python/__main__.py,sha256=BAGy1phd26WWcGM9TKHbqIpeZliVofopBndtMIPtDQ0,651
23
23
  ladyrick/patch/python/usercustomize.py,sha256=8mYpcZ8p-l41fiSJue727n8cAmcEmUktObDYZDdLJfs,218
24
- ladyrick-0.5.5.dist-info/licenses/LICENSE,sha256=EeNAFxYAOYEmo2YEM7Zk5Oknq4RI0XMAbk4Rgoem6fs,1065
25
- ladyrick-0.5.5.dist-info/METADATA,sha256=5F-dTbYGPoApk--A2gPS5cS_Ev4f3WRRRLKbPrYq4S8,883
26
- ladyrick-0.5.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
- ladyrick-0.5.5.dist-info/entry_points.txt,sha256=28kidI1OCOAi7S1aHBr8veak49VNZ0tWFvf-Ty8UmSU,225
28
- ladyrick-0.5.5.dist-info/top_level.txt,sha256=RIC3-Jty2qzLYXSOr7fOu1loTwlMU9cF6MFeGIROxWU,9
29
- ladyrick-0.5.5.dist-info/RECORD,,
24
+ ladyrick-0.5.6.dist-info/licenses/LICENSE,sha256=EeNAFxYAOYEmo2YEM7Zk5Oknq4RI0XMAbk4Rgoem6fs,1065
25
+ ladyrick-0.5.6.dist-info/METADATA,sha256=s-vKvkA34C7DS3PXt2QygfVzhmBxSJC42bawDe_QC8Q,883
26
+ ladyrick-0.5.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
+ ladyrick-0.5.6.dist-info/entry_points.txt,sha256=28kidI1OCOAi7S1aHBr8veak49VNZ0tWFvf-Ty8UmSU,225
28
+ ladyrick-0.5.6.dist-info/top_level.txt,sha256=RIC3-Jty2qzLYXSOr7fOu1loTwlMU9cF6MFeGIROxWU,9
29
+ ladyrick-0.5.6.dist-info/RECORD,,