timeoutコマンドとは
timeout
コマンドは、時間とコマンドを指定しコマンドを実行するコマンドです。たとえ無限ループであったとしても、実行開始から、指定した時間が経過した段階で、コマンドの実行を終了してくれます。
$ sleep 10 # 10秒間sleepして、プロンプトに戻る。
$ timeout 5 sleep 10 # sleepの指定は10秒だけど、5秒経過時点で終了してプロンプトに戻る。
# !/bin/sh
while true;do
echo "test"
done
$ ./test.sh # 無限ループ。
test
test
test
...
(Ctrl+C)
$ timeout 5 ./test.sh # 5秒で戻ってくる。
test
test
test
...
test
$
timeoutコマンドをsudoコマンドと組み合わせたときの注意点
このtimeout
コマンドをsudo
コマンドと組み合わせて使うとき、その指定の位置によって結果が変わってきます。
$ sudo timeout 10 ./test.sh # パターン1
$ timeout 10 sudo ./test.sh # パターン2
この場合、10秒後にプロンプトに戻るのはパターン1です。パターン2ですと、無限ループに突入したまま返ってきません。
ちゃんと実装を見たわけではないですが、timeout
コマンドが一般ユーザで実行されている以上、sudo
によって管理者権限で実行されたプロセスを操作できなくなっているためと推測されます。
どんなときに影響がでるのか
BPF Compiler Collectionという、便利な計測ツール群があります。
その中のfileslowerというツールは、ディスクIOの遅いプロセスとファイルを表示してくれる便利なツールです。標準では読み込み/書き込みが10ms以上掛かっているプログラムを表示してくれます。
このツールは、実行するとストリーム状に無限に表示をし続けます。また、その性質上、スーパーユーザ権限を要求します。
おそらく、自動監視用と言うよりは、管理者がコンソールからその場で眺めるために使うツールなのだと思いますが、これをcronで定期的に取得したい場合や、他の監視ツールと組み合わせてiowaitが大きいときに実行したいという場合には、ちょっと使いにくいものになってしまいます。
その際に、timeout
コマンドを利用すれば、一定時間内だけ取得してリダイレクトでファイルに出力と言うことも可能になります。その際に、sudo
との関係が出てくるわけです。
実際に実行する際には、以下の様なコマンドをcron実行させることになると思います。
# !/bin/sh
sudo timeout 10 /usr/share/bcc/tools/fileslower -a
紛らわしい感じがしますが、timeout
とsudo
の位置は間違えないように注意です。
追記
cronで実行する際は、実行ユーザを設定ファイルで指定できるので、sudo
を使う必要は無いかも知れないなというのは、書き終わったあとに気づいたことでした…
とはいえ、コンソールから実行する際も、本稿のことを考慮していないとうまく動かないこともあるかと思うので、このまま記事は残しておきます。