以前にこのような質問を受けたことがある場合は、本当に申し訳ありません。この作業は非常に重要なデータに関連しており、本当に助けが必要であり、過去2時間で助けることができませんでした。
本質的に rm -r を実行するとき、誤字のため誤って誤ったフォルダを削除しました。私が知っている限り、ファイルはまだ存在しますが、リンクは削除されました。これらのファイルを使用するプロセスはまだ実行中であるため、プロセスが終了するまで引き続きアクセスできるように見えます(以降は永遠に失われる必要があります)。過去2時間ほど、プロセスのデータをフォルダに書き込んでファイルを復元しようとしました。しかし、単一のファイルに対してのみこれを行う方法を見つけることができました。
実行時に、出力にはlsof | grep ./
まだすべてのファイルとサイズが表示されます。まだ復元が可能だと信じるようにしますね。リンクが消えてもプログラムはまだうまく機能するため、プロセス自体もファイルにうまくアクセスできるようです。
使用した方法を試してみましたが、cp /proc/32184/fd/103 ./resoration
1つのファイルのみが回復するようです。サーバーをシャットダウンせずにファイルを失うことなく、すべてのファイルをすばやく復元する方法はありますか?
一部のデータを手動でバックアップしましたが、サイズが大きすぎてすべてバックアップできません。
この問題を解決するのに役立つすべての人に感謝し、以前にこの質問を受けたことがある場合は、もう一度お詫び申し上げます。
答え1
スクリプトを自分で書くことができます。
PID=..your process..
export RESTORE_TO_DIR=some_place
find "/proc/$PID/fd" -lname '* (deleted)' -printf '%p %l\0' |
xargs -0 sh -c '
for l; do
f=${l%% *}; t="$RESTORE_TO_DIR${l#* }"
echo mkdir -p "${t%/*}" && echo cp -vb "$f" "${t% (deleted)}"
done
' sh
よさそうな場合は、古いものecho
を削除してください。空の文字列に設定するとmkdir
cp
RESTORE_TO_DIR
しなければならない削除したファイルを元の場所に復元します。
一部のコメントとは異なり、削除されたファイルへのハードリンク(どのディレクトリでも参照されないインデックスノード)を作成することはできません。