質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2461閲覧

標準入力を監視するWatchdogプログラム

YouheiSakurai

総合スコア6142

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/06/30 12:18

編集2019/06/30 14:06

以下の動きをするシンプルなコマンドについて、すでにもうどこかに存在しそうな気もするのですが、見つけられなかったのでPythonで書きました。でも、できれば再発明した車輪をプロジェクトに組み込むのは避けたいと思っています。こんな動きをする既存のLinuxコマンド or Pythonライブラリ or Goパッケージ or シェル芸をご存知の方はいませんでしょうか?

  1. 標準入力からの入力を指定秒待つ。
  2. 指定秒の間に何かしらの入力があれば、1に戻る。
  3. 指定秒の間に何も入力がなければ、引数で指定されたコマンドを実行する。そして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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Bashで簡単に書けるので、これに特化した専用のコマンドは無いと思います。

Bash

1#!/bin/bash 2TIMEOUT=$1 3shift 4while true 5do if read -t $TIMEOUT dmy 6 then 7 "$@" 8 fi 9done

投稿2019/06/30 13:14

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YouheiSakurai

2019/06/30 13:22

なるほど、「read -t」が突破口ですね。ありがとうございます。視野が広がりました。
otn

2019/06/30 13:28

質問とは関係ないですが、grep には --line-buffered オプションを付けないと、行単位でフラッシュされないので、パイプ後段での検知が遅れます。 (grep内の出力バッファが満杯になってから初めてパイプに出力される)
YouheiSakurai

2019/06/30 13:33

重ね重ねありがとうございます。そこはハマりそうで、そしてハマるとなかなか抜け出せそうにないトラップですね。助かりました。引き続き精進します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問