日別: 2018年1月11日

strace コマンドで遊ぶ

「ふつうの Linux プログラミング」という本をラビットハウス社で輪読しているが、その中で strace コマンドというものが出てきた。

man STRACE(1)

man によると strace とはシステムコールとシグナルをトレースできるツールのようだ

  • NAME: strace – trace system calls and signals
  • SYNOPSIS: strace [-CdffhiqrtttTvVxxy] [-In] [-bexecve] [-eexpr]… [-acolumn] [-ofile] [-sstrsize] [-Ppath]… -ppid… / [-D] [-Evar[=val]]… [-uusername] command [args]
  • In the simplest case strace runs the specified command until it exits. It intercepts and records the system calls which are called by a process and the signals which are received by a process. The name of each system call, its arguments and its return value are printed on standard error or to the file specified with the -o option.

hello, world の strace

ハロワの strace を見てみよう。テスト対象のコードを書く必要もない気がするけど、次のとおり。

コンパイルして、strace を実行してみる。ちなみに実行環境は CentOS 7。

write(1, "Hello, World!\n", 14Hello, World!) = 14 とあるように標準出力に Hello, World!\n という文字列を write(2) しているのがわかる。 -c オプションをつけるとなんかかっこいい感じに統計情報をだしてくれる。

-e オプションでトレースしたいシステムコールを指定できる

echo のソースコード

ハロワを出力するだけなら echo で良いので、echo の strace をみてみた

echo なんかもおんなじ感じの出力になったので、ソースコードを探しに南米へと飛んだ

なるほどな… と思ってソースコード探そうとしたら江添さんがすでにいろんなUNIX環境での echo のソースコードについて比較している記事が引っかかった。ふむふむ〜。で、実際のソースコードがこれ。意外にながくてクソだるですわ…。結局最後のほうで、fputs, putchar を呼び出している感じで、これらは内部でバッファリングして、write を呼び出しているので、システムコールの呼び出しは 1回なのだろうみたいな感じの模様。

macOS で dtruss を使う

macOS では strace の代わりに dtruss を使えば同じようなことして遊べそう。

logrotate のログ保持日数の変更

例えば以下のような fluentd ログの logrotate 設定が入っているとします。

この前提のもと、保持する世代を減らすために rotate の設定を 8 から 5 に減らす場合には注意が必要で、6世代目ファイルのみが削除され、6-8世代のファイルが残ってしまいます。簡単に次のようなコマンドで消しておくとよいかも。保持期間を増やすときはあまり問題は生じなそう?

各設定項目は man を見るのが一番良さそう。ソースコードはここでみれます。
ちなみに logrotate の状況は /var/lib/logrotate/logrotate.status で確認できます。

ファイルを掴みっぱなしになってるプロセスへの対応

  1. postrotate でシグナルをおくってやる
  2. copytruncate オプションをつける

copytruncate 便利ですね…