長時間にわたるシェル スクリプト関数のタイムアウト実装
シェル スクリプトでは、特定の関数の実行に過度に時間がかかり、遅延が発生する状況が発生することがあります。あるいは無限ループさえあります。これを防ぐには、指定された時間枠内にそのような関数が完了しない場合に終了するタイムアウトを実装するのが一般的です。
効果的なアプローチの 1 つは、非同期タイマーを使用してタイムアウトを強制することです。タイマーを設定すると、指定された期間を超えた場合に関数を終了でき、スクリプトが意図したとおりに実行し続けることが保証されます。
これを実装するには、Python が提供するシグナル モジュールを利用できます。タイムアウト デコレータを定義して関数をラップする方法は次のとおりです。
import signal import functools class TimeoutError(Exception): pass def timeout(seconds=10, error_message=os.strerror(errno.ETIME)): def decorator(func): def _handle_timeout(signum, frame): raise TimeoutError(error_message) @functools.wraps(func) def wrapper(*args, **kwargs): signal.signal(signal.SIGALRM, _handle_timeout) signal.alarm(seconds) try: result = func(*args, **kwargs) finally: signal.alarm(0) return result return wrapper return decorator
タイムアウト デコレータを取得したら、設定したタイムアウト後に終了したい関数にそれを適用できます。たとえば、10 秒後にタイムアウトしたい long_running_function という関数がある場合、次のように装飾できます。
from timeout import timeout @timeout def long_running_function(): ...
タイムアウト デコレータを使用すると、シェル スクリプト関数がタイムアウトするのを効果的に防ぐことができます。執行が長期化したため無期限絞首刑となる。このアプローチにより、不必要な遅延や中断が発生することなくスクリプトが確実に実行され続けることが保証されます。
以上が長時間実行されるシェル スクリプト関数のタイムアウトを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。