Linuxでプログラムの動作がおかしい、なぜかエラーになる、ファイルにアクセスできない――そんなトラブルシューティングの場面で強力な味方となるのが「strace」コマンドです。straceは、実行中のプログラムがOSとどのようにやり取りしているのかを「システムコール」のレベルで追跡・記録することができます。これは、Linuxカーネルに対してどのような要求が行われているのかを明らかにするための重要なツールです。本記事では、straceの基本的な使い方から、よくある活用例、トラブルシューティングへの応用まで、実用的な内容をわかりやすく解説します。
straceは、「System Trace」の略で、Linux上で動作しているプロセスのシステムコール(syscall)をトレース(追跡)するためのコマンドです。ユーザー空間のプログラムがOSの機能を利用する際、ファイルの読み書き、プロセスの生成、ネットワーク通信など、カーネルに対して何らかの「リクエスト」を出します。このリクエストがシステムコールであり、straceはそれらを監視・記録します。
たとえば、以下のような操作がトレースされます。
open()
:ファイルを開くread()
/ write()
:ファイルやソケットを読み書きfork()
/ execve()
:プロセスの生成connect()
/ accept()
:ソケット通信の確立これにより、プログラムが内部で何をしているのかが手に取るようにわかるのです。
straceを使うには、以下のようにコマンドの前に付けるだけです。
strace コマンド名 [引数]
strace ls
これを実行すると、lsコマンドが起動中に呼び出している全てのシステムコールが表示されます。標準出力に大量の出力が流れてくるので、最初は戸惑うかもしれませんが、慣れてくると有用な情報を素早く拾い上げられるようになります。
straceにはフィルター機能があり、特定のシステムコールだけを絞って表示することが可能です。
strace -e trace=open,read,write ls
この例では、open()
, read()
, write()
というファイル関連のシステムコールだけを表示します。ノイズを減らして必要な情報に集中するために便利なオプションです。
また、以下のようにネットワーク関連の呼び出しだけに絞ることも可能です:
strace -e trace=network curl example.com
標準出力に表示される内容をファイルに保存するには、-o
オプションを使用します。
strace -o trace.log ls
このようにすると、システムコールの内容がtrace.log
というファイルに保存され、後でゆっくり確認することができます。特に複雑なプログラムをトレースする場合に重宝します。
すでに起動しているプロセスを監視したい場合は、プロセスID(PID)を指定してstraceを使うことができます。
strace -p 12345
12345
は対象プロセスのPIDです。例えば、Webサーバーなど常駐プロセスの動作確認に使われます。複数のPIDに同時アタッチすることも可能です。
プログラムがファイルを開こうとして失敗している場合、straceを使えばエラーの原因がすぐにわかることがあります。
strace ./myapp
出力の中に以下のような行があれば:
open("/etc/myconfig.conf", O_RDONLY) = -1 ENOENT (No such file or directory)
これは「/etc/myconfig.confというファイルが存在しない」というエラーを意味します。ファイル名の間違いや、パーミッション設定の問題など、問題箇所が明確になります。
たとえば、curlでサイトに接続できない場合に以下を試すと:
strace -e trace=network curl https://example.com
以下のような出力が出ることがあります:
connect(3, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("93.184.216.34")}, 16) = -1 ECONNREFUSED (Connection refused)
これは対象サーバーの443番ポートが拒否されていることを示しています。ファイアウォールやサービスの死活を疑う必要があります。
オプション | 内容 |
---|---|
-e trace=... | 特定のシステムコールだけを表示 |
-o ファイル名 | 出力をファイルに保存 |
-p PID | 既存プロセスにアタッチ |
-f | 子プロセスのシステムコールも追跡 |
-tt | 時刻付きで出力 |
-T | システムコールの実行時間を表示 |
これらのオプションを組み合わせることで、目的に応じた詳細なトレースが可能になります。
straceは非常に便利なツールですが、いくつか注意点もあります。
本番環境での利用には慎重を期すべきですが、開発・テスト環境では積極的に活用すべきツールです。
straceは、Linuxの世界における強力なデバッグ・トレースツールのひとつです。システムコールという低レベルのやりとりを可視化することで、プログラムの挙動を深く理解し、トラブルの原因を明らかにすることができます。基本的な使い方をマスターしておけば、ファイルアクセスの失敗、ネットワークエラー、パーミッション問題など、さまざまな問題解決に役立ちます。
「なんで動かないんだろう?」と感じたら、まずは一度straceで中を覗いてみましょう。そこには、解決のヒントが詰まっているかもしれません。