実行中のプログラムが開こうとしている(そして失敗している)ファイルのフルパスを把握しようとしています。 strace
でこれができることを理解するように言われましたが、どうやら正しく使用していないようです。実行中のプログラムはサービスであるため、strace
で直接実行する簡単な方法がわかりません。私が見た例はそれを次のように見せます
$ Sudo strace -p <process id> -e open,access
は実行中のプロセスにアタッチする正しい呪文ですが、これを実行すると、問題のプログラムがファイルを開こうとして失敗したことをログに記録していても、出力が表示されません。での出力も表示されません
$ Sudo strace -p 24249
Process 24249 attached - interrupt to quit
futex(0x7f650fe159d0, FUTEX_WAIT, 24250, NULL
なんらかの理由でfutexが切断されているようなものですか?それとも、その状況に対する通常の出力ですか?
とにかく、私は何が間違っているのですか?
サービス自体でstraceを実行すること、つまりサービスを手動で開始するときにstraceを実行することは可能ですか?.
strace -ffttTo /tmp/strace.out service <foo> start
そして、生成されたファイルをペーストビンします。
編集:ファイルを開くことができないので、キーワードENOENTまたはgrep文字列No such file or directory
で検索できますか。
EDIT2:出力をもう一度見て、futexのmanページを確認しました。したがって、メモリ位置0x7f650fe159d0にアクセスしている何かがロック、おそらく共有ロックを保持していて、それを解放していないようです。 pid24250も引数です。このpidが何をしているのか確認できますか。
また、pid24249が関連付けられているカーネル関数を確認できますか。 ps -eo wchan <pid>
コマンドのwchanオプションを使用して表示できます。完全な詳細なwchanリストは覚えていませんが、明日お届けします。 (ここはかなり夜です)。