Mac OSXでプロセスが開いている間に削除されたファイルを開く方法は?

Mac OSXでプロセスが開いている間に削除されたファイルを開く方法は?
b2-osx108v8-01:~ bamboo$ lsof -p 264
COMMAND PID   USER   FD     TYPE            DEVICE  SIZE/OFF     NODE NAME
<lines removed>
java    264 bamboo   20w     REG               1,2    240906 14883372 /Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSML/SimbaProcessManager.log.0
<lines removed>

ディレクトリ/Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSMLは削除されましたが、ファイルはまだデーモンによって開かれています。このログをどのように表示できますか? Linuxではを使用します/proc/264/fd/20が、OSXでは使用できないようです。

ベストアンサー1

<編集>

これがLinuxの場合は、トリックgdbを使用することもできます。しかし、OS Xでは、このトリックはLinux固有の動作に依存しているため、除外できることがわかりました/dev/fd/()。/proc/self/fd/

それは私が知っているすべてであり、肯定的なアドバイスはありません。

</edit>

本当に怖いかもしれませんが、考えてみましたかgdb? 1つのパッケージには2つの素晴らしい機能があります:Cインタプリタと選択したプロセスにコードを挿入する方法!明らかにデバッグにも使用できます。

幸い、C標準ライブラリにはスクリプトを解釈する関数も含まれています。プラットフォームのスクリプト言語はCよりも書くのが簡単です。

lessOS X用のスクリプトを思いつきました。これは、ログファイルの先頭を返す脆弱なハッキングです。OS X、bash:開いたファイル記述子では動作しませんが、catは機能しません。ログファイル全体を読み取った後、lessFDの場所はファイルの末尾になければなりません。これは介入前の元の場所になることを願っています。

<編集> ただし、ファイルが読み取り用に開いている場合にのみ機能します。出力によると、lsofファイルは書き込み用にのみ開いています。 </EDIT>

gdb -p 264 <<EOF
call (int) system("exec </dev/null >/tmp/log 2>&1; less /dev/fd/20")
EOF

戻り値の型をキャストしないと、システムが知らない戻り値の種類について文句を言うからですsystem()。おそらく、これはパラメータの種類が不明であることを意味するので、すでに良い考えのように聞こえます。

ファイル記述子を操作するためにLinuxボックスでそれを使用しようとしたとき、何とか働きました...system()一度。私はそれが永遠に動作することを保証しません:)。たとえば、技術的に言えば、プログラムが信号ハンドラまたはsystem()それ自体を実行している場合、これが安全であるという保証はありません。 (system()「リエントラント」が保証されるいくつかの機能の1つではありません)。

おすすめ記事