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よりも書くのが簡単です。
less
OS X用のスクリプトを思いつきました。これは、ログファイルの先頭を返す脆弱なハッキングです。OS X、bash:開いたファイル記述子では動作しませんが、catは機能しません。ログファイル全体を読み取った後、less
FDの場所はファイルの末尾になければなりません。これは介入前の元の場所になることを願っています。
<編集> ただし、ファイルが読み取り用に開いている場合にのみ機能します。出力によると、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つではありません)。