以下の動きをするシンプルなコマンドについて、すでにもうどこかに存在しそうな気もするのですが、見つけられなかったのでPythonで書きました。でも、できれば再発明した車輪をプロジェクトに組み込むのは避けたいと思っています。こんな動きをする既存のLinuxコマンド or Pythonライブラリ or Goパッケージ or シェル芸をご存知の方はいませんでしょうか?
- 標準入力からの入力を指定秒待つ。
- 指定秒の間に何かしらの入力があれば、1に戻る。
- 指定秒の間に何も入力がなければ、引数で指定されたコマンドを実行する。そして1に戻る。
python
1from select import select 2from subprocess import run 3from sys import argv 4from sys import stderr 5from sys import stdin 6 7 8def watchdog(fp, timeout, cmd): 9 while True: 10 if select([fp], [], [], timeout)[0]: 11 next(fp) 12 else: 13 run(cmd) 14 15 16def main(): 17 try: 18 watchdog(stdin, int(argv[1]), argv[2:]) 19 except (IndexError, ValueError): 20 print("Usage: %s timeout command [argument] ..." % argv[0], 21 file=stderr) 22 except KeyboardInterrupt: 23 pass 24 25 26if __name__ == "__main__": 27 main()
使用例
bash
1$ (while :; do some-application; done) & 2$ tail -F /var/log/xxx.log | grep heartbeat | watchdog 60 pkill some-application
よろしくお願いします。
追記(回答を受けて)
奥が深い。。。
bash
1watchdog() { T=$1; shift && while :; do read -t $T || "$@"; done }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/30 13:22
2019/06/30 13:28
2019/06/30 13:33