В настоящее время Tar читает файл объемом 2 ГБ, и я удалил его единственную ссылку. Как я могу остановить его от вечной работы?

4

Еще немного информации:

Я tarделал резервную копию большого каталога , только там было несколько больших файлов, которые я не ожидал. Это соединение по сети и очень медленное, поэтому просто ждать его нельзя.

Ни в одном из этих файлов нет ничего важного.

Я удалил содержимое первых нескольких из echo > fileних, сохранив ссылку, чтобы tar перестал их читать, но затем я и rm -rfвесь каталог, пока tarчитал файл 2 ГБ в этом каталоге. Теперь он tarсодержит единственную ссылку на него, и я не могу найти никакого способа заставить его двигаться дальше, чем начинать сначала.

Файл находится в файловой системе ext4, доступ к которой осуществляется через сеть с помощью sshfs.

Functino
источник
1
(NAA, так как у меня нет коробки для проверки деталей, но я думаю, что вы можете получить доступ к этому файлу через /proc/(pid of tar)/fd/(number)или через некоторое время, и, возможно, вы можете обрезать его с помощью echo, как вы это делали с остальными.)
Ульрих Шварц,
Вы могли бы, вероятно, отследить tar с помощью gdbили схожим образом и заставить его думать, что он обнаружил EOF в этом файле ... (Не публиковать в качестве ответа, потому что это требует много объяснений и некоторого тестирования - любой, кто захочет, может украсть идею за его / ее ответ.)
Дероберт
1
Вы можете запустить gdb, подключиться к процессу tar, заставить его остановиться во время a read()из файла, а затем дать return (int)-1команду gdb, чтобы заставить tar считать чтение неудачным.
Марк Плотник
@ Марк Я думаю, у GDB есть способ нарушить функции .. Похоже, это может работать.
Functino
Я думаю, что это также предоставляет способ переопределить возвращаемое значение, чтобы вы могли вернуться 0, сигнализируя EOF.
Functino

Ответы:

4

echo >fileбыло бы простым решением. Но как только вы удалили файл, это уже невозможно.

Но ждать! Поскольку вы используете файловую систему ext4, я предполагаю, что этот tar работает в Linux. (Некоторые, но не все другие варианты Unix допускают аналогичное решение.) В Linux вы все равно можете получить доступ к удаленному, но открытому файлу, где находится идентификатор процесса, в котором открыт файл, и дескриптор файла, с помощью которого файл открыт. Этот файл является символической ссылкой на файл, но он магический. Это остается в силе, даже если файл удален. Если вы посмотрите на это с , вы увидите что-то вроде/proc/PID/fd/FDPIDFDls -l

/proc/1234/fd/4 -> /path/to/file (deleted)

на первый взгляд битая ссылка, но вы действительно можете открыть этот файл. В частности, вы можете обрезать его чем-то вроде : >/proc/1234/fd/4.

Если вы работаете в системе без /proc, вы можете использовать отладчик, чтобы сам процесс tar выполнял за вас усечение. Присоедините отладчик к процессу, а затем заставьте его выполнить, truncate(4)где 4 - дескриптор файла, из которого tar читает. Например, с GDB вы можете попробовать что-то вроде

$ ps
…     find the PID of the tar process, e.g. 1234
$ lsof -p1234
…     find the file descriptor that you want to act on, e.g. 4
$ gdb -pid 1234
…
(gdb) call truncate(4)
(gdb) detach

Это может или не может запутать tar, так как это может привести к тому, что некоторая структура данных, которую он использует, будет непоследовательной, поэтому я рекомендую поэкспериментировать, прежде чем попробовать ее на самом деле.

жилль
источник
1

Остановить смолу?

ps aux | grep tar

Find the pid of the tar process

kill $PID
Hack Saw
источник
К сожалению, это означает, что нужно начинать с процедуры, которая уже заняла много времени. Я, вероятно, подожду еще час, и если на самом деле нет никакого способа просто сказать tar«забудь об этом», я укушу пулю.
Functino