LoginSignup
2
1

More than 3 years have passed since last update.

timeoutコマンドとsudoコマンドの注意点

Last updated at Posted at 2019-05-18

timeoutコマンドとは

timeoutコマンドは、時間とコマンドを指定しコマンドを実行するコマンドです。たとえ無限ループであったとしても、実行開始から、指定した時間が経過した段階で、コマンドの実行を終了してくれます。

$ sleep 10  # 10秒間sleepして、プロンプトに戻る。
$ timeout 5 sleep 10  # sleepの指定は10秒だけど、5秒経過時点で終了してプロンプトに戻る。
test.sh
#!/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

紛らわしい感じがしますが、timeoutsudoの位置は間違えないように注意です。

追記

cronで実行する際は、実行ユーザを設定ファイルで指定できるので、sudoを使う必要は無いかも知れないなというのは、書き終わったあとに気づいたことでした…

とはいえ、コンソールから実行する際も、本稿のことを考慮していないとうまく動かないこともあるかと思うので、このまま記事は残しておきます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1