LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルシステムにおいて、「プログラムが急に止まってしまった」「ログにエラーが出ないのにアクセス権限で弾かれる」といった、原因不明のトラブルに直面したことはありませんか? そんな時に非常に役立つのが、 プロセスが発行するシステムコールとシグナルをトレース(追跡)できる「straceコマンド」 です。
本記事では、straceコマンドの基本的な使い方と出力情報の見方、実践的な活用方法までを初心者にもわかりやすく解説します。
記事のポイント
straceはプロセスのシステムコール(OSOS [オーエス]Operating System。基本ソフトウェアへの要求)を追跡するデバッグツール。- ログに残らない根本原因(Permission denied や File not found など)の特定に強い。
-p(実行中プロセスへのアタッチ)、-o(ファイル出力)などのオプションが重要。-eオプションで特定のシステムコールのみを絞り込むと調査がスムーズ。- 出力内容が膨大になるため、リダイレクトやファイル出力を活用するのが基本。
straceとは?何ができるコマンドなのか
strace(system call trace)は、プログラムとLinuxカーネルの間のやり取り、すなわちシステムコールを監視・記録するコマンドです。
プログラムは単独で動いているわけではなく、ファイルを開く(open)、データを読み書きする(read / write)、メモリを確保する(mmap)といった動作を行う際、必ずOS(カーネル)に処理を依頼します。これが「システムコール」です。
straceを使えば、「プログラムがOSに対してどのような要求を出し、その結果どうなったか(成功したか、エラーが発生したか)」をリアルタイムで覗き見ることができます。そのため、アプリケーション側のエラーログだけでは分からないような、インフラレベルの根本原因を特定するのに非常に強力なツールとなります。
straceコマンドの主な用途
- ログに原因が出ないエラーの調査: アプリケーション側で「エラーが発生しました」としか表示されない場合でも、「どのファイルへのアクセスで権限エラーが出たか」を特定できます。
- 設定ファイルの確認: プログラムが起動時に「どの設定ファイルを読み込もうとしているか」「どの順序で読み込んでいるか」を追跡できます。
- プロセスのハングアップ(フリーズ)調査: どの処理(システムコール)で処理が止まっているかを確認できます。
straceの基本構文と主要なオプション
straceの基本構文
# 新しくコマンドを実行して追跡する場合strace [オプション] コマンド [コマンドの引数]
# すでに実行中のプロセスを追跡する場合strace -p [プロセスID(PID)]注意点:
straceを実行するには、原則として対象プロセスの所有者であるか、または root権限(sudosudo [スードゥー / スーデュー]Superuser doの略。一時的に他のユーザー(主に管理者特権)の権限でコマンドを実行する) が必要です。【補足】実務では「ほぼsudo必須」と考えましょう
Linuxカーネルのセキュリティ機構(Yama LSMのptrace_scope)により、UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューションなどの多くのディストリビューションでは、同じユーザーであっても自分の子プロセスでない別プロセスへのアタッチがroot権限なしでは拒否されるようデフォルトで設定されています(ptrace_scope=1)。そのため、実務の現場においては「`strace -p` を使うならsudoが前提」と考えておくとスムーズです。
straceでよく使われるオプション一覧
| オプション | 内容 | 使用例 |
|---|---|---|
-p PID | 指定したPIDの実行中プロセスにアタッチする | sudo strace -p 1234 |
-o ファイル | 実行結果を標準エラー出力ではなく、指定したファイルに出力する | strace -o trace.log ls |
-f | 子プロセス(fork/vforkで生成されたプロセス)も追跡する。マルチプロセスの調査に必須 | strace -f -p 1234 |
-e expr | 特定のイベント(システムコールなど)に絞り込んで表示する | strace -e open,read |
-t / -tt | 各システムコールが発行された時刻を表示(-ttはマイクロ秒単位) | strace -tt -p 1234 |
-T | 各システムコールの処理に要した時間を表示する。処理の遅延(ボトルネック)調査に必須 | strace -T -p 1234 |
-c | システムコールの実行回数、エラー回数、所要時間などの統計情報を集計して表示する | strace -c ls |
-s サイズ | 文字列を表示する際の最大文字数を指定(デフォルトは32)。長いSQLSQL [エスキューエル / シークエル]Structured Query Language。関係データベース(RDB)の管理や操作を行うデータベース言語などを確認したい場合に有効 | strace -s 1024 -p 1234 |
straceの出力情報の見方
straceを実行すると、膨大なログが出力されます。基本的な見方を押さえておきましょう。
$ strace cat /etc/hostnameexecve("/usr/bin/cat", ["cat", "/etc/hostname"], 0x7ffd5...) = 0brk(NULL) = 0x55bc2......(中略)...openat(AT_FDCWD, "/etc/hostname", O_RDONLY) = 3read(3, "myserver\n", 131072) = 9write(1, "myserver\n", 9myserver) = 9close(3) = 0...出力の基本構造は以下のようになっています。
システムコール名(引数1, 引数2, ...) = 戻り値 [エラー内容]
- システムコール名: 実行された処理(
open,read,write,closeなど) - 引数: 処理に渡された値(ファイルパスやファイルディスクリプタ番号など)
- 戻り値: 処理の結果(成功した場合は正の数や0、失敗した場合は
-1) - エラー内容: 失敗した場合(戻り値が-1の場合)、エラーの定数と詳細(例:
ENOENT (No such file or directory))
注目すべき重要なシステムコール
| システムコール | 役割・意味 |
|---|---|
open / openat | ファイルを開く。ファイルが見つからない(ENOENT)か、権限がない(EACCES)かを見るのに重要 |
read | ファイルやソケットからデータを読み込む |
write | ファイルやソケットにデータを書き込む |
close | ファイルを閉じる |
connect | ネットワーク接続を開始する |
stat / fstat | ファイルの状態(サイズや権限など)を取得する(※実際のログでは newfstatat として出力されることが多いです) |
現場で使える!straceの活用例
straceの活用例~実行中プロセスのトラブルを調査する(アタッチ)~
すでに動いているWebサーバなどが不調な場合、プロセスIDを指定して調査します。
sudo strace -p 1234 -f1234というPIDのプロセスと、その子プロセス(-f)の動きをリアルタイムで監視します。Ctrl+Cで終了すると、プロセスはそのまま動き続けます(straceのみが終了します)。
straceの活用例~出力結果をファイルに保存する~
straceは出力が非常に多いため、画面で追うのは困難です。必ずファイルに出力しましょう。
sudo strace -p 1234 -o strace_output.log後から grep コマンドなどで strace_output.log の中身を「ENOENT(ファイルなし)」や「EACCES(権限エラー)」で検索すると、問題箇所を素早く特定できます。
straceの活用例~特定のシステムコールだけを絞り込む~
ファイルアクセスに関するエラーを調査したい場合、ネットワーク通信などを省いて open 関連だけに絞ると見やすくなります。
strace -e open,openat,stat cat /etc/hostnameネットワーク関連の問題(DBに接続できないなど)を調べる場合は、-e trace=network または -e %network(ネットワーク関連のシステムコールを一括指定)が便利です。
straceの活用例~パフォーマンスのボトルネックを特定する(統計機能)~
プログラムの処理に時間がかかっている場合、どのシステムコールにどれだけの時間を消費しているかをサマリーで確認できます。
strace -c ls /実行が完了すると、呼び出された回数(calls)やエラー回数(errors)、処理に費やした時間の割合(% time)などが表形式で表示されます。
まとめ:straceを使いこなすために
straceは、プログラムがOSに要求する処理(システムコール)を覗き見できる強力なツール。- トラブルシューティングの際、「ファイルがないのか」「権限がないのか」「ネットワークが繋がらないのか」をインフラレベルから調査できる。
-pで実行中プロセスにアタッチ、-oでファイル出力、-fで子プロセスの追跡を組み合わせるのが基本。-eオプションで特定の処理に絞り込んだり、-cで統計情報を取ることで、効率的に原因究明が可能。
アプリケーションのログだけでは解決できない難問に直面したときは、ぜひstraceコマンドを活用してみてください。システムのブラックボックスが透明になり、問題解決のスピードが劇的に向上するはずです。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。