Усечение файла, в то время как это используется (Linux)

Обновлен для .NET Core> = 2.x и / или VS2017

В VS2017 в проектах .NET Core снова используется структура .csproj.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreappx.y</TargetFramework>
  </PropertyGroup>

или

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandardx.y</TargetFramework>
  </PropertyGroup>

Старый ответ для .NET Core 1.x и VS2015

Есть некоторые показатели.

Существование project.json предполагает, что это одна из более новых форм проекта (однако следует помнить, что project.json исчезнет с .NET Core / .NET Core Tools для VS с Версией 1.1).

Внутри него у вас будет раздел фреймворков, например

"frameworks": {
  "net45": {
    "frameworkAssemblies": {
      "System.Runtime.Serialization": "4.0.0.0"
    }
  },
  "netstandard1.0": {
    "imports": [ "dnxcore50", "portable-net45+win8" ],
    "dependencies": {
    }
  },
  "netstandard1.3": {
    "imports": [ "dnxcore50", "portable-net45+win8" ],
    "dependencies": {
      "System.Runtime.Serialization.Formatters": "4.0.0-rc3-24212-01"
    }
  }
}

В случае приложений (ASP.NET Core Web Project или новых консольных приложений на основе project.json), netstandard1.x будет назван netcoreapp1.0.

Если имеется более одной записи, приложение или библиотека предназначены для нескольких платформ (и будут создавать несколько двоичных файлов в отдельных папках).

Обновление

Конечно, я забыл еще один индикатор. Приложение .NET Core содержит ссылку Microsoft.NETCore.App (либо как "type": "platform" для переносимых приложений, либо без нее для автономных приложений). netstandard1.x (библиотеки классов) ссылаются на NETStandard.Library.

Приложения .NET Core основаны на System.Runtime, который является частью .NET Framework 4.5 и новее и используется для приложений Windows (и Windows Phone) 8.0 / 8.1 / 10, поэтому пакеты portable-net45+win81 совместимы с .NET Ядро тоже.

При этом ASP.NET Core - это веб-стек, который может работать как на полной .NET Framework (4.5 или выше), так и на .NET Core. Так что наличие приложения ASP.NET Core мало что говорит о платформе, на которую оно нацелено.

34
задан Hobo 11 June 2009 в 10:49
поделиться

8 ответов

Взгляните в утилите split (1) , входящей в состав GNU Coreutils.

9
ответ дан 27 November 2019 в 16:04
поделиться

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

1
ответ дан 27 November 2019 в 16:04
поделиться

Проверяли ли вы поведение каких-либо сигналов, таких как SIGHUP, для стороннего продукта, чтобы узнать, начнет ли он регистрировать свежий файл? Сначала вы переместите старый файл на постоянное имя.

kill -HUP [идентификатор-процесса]

А затем он снова начнет записывать.

В качестве альтернативы (как предложил Билли), возможно, перенаправить вывод из приложение к программе регистрации, такой как multilog, или той, которая обычно используется с Apache, известная как cronolog. Тогда у вас будет более точный контроль того, где все идет, до того, как оно будет записано в этот начальный файловый дескриптор (файл), а это действительно все.

2
ответ дан 27 November 2019 в 16:04
поделиться

В Linux (на самом деле все унициклы) файлы создаются, когда они открываются, и удаляются, когда на них ничего не ссылается. В этом случае программа, открывшая его, и каталог, в котором он был открыт, содержат ссылки на файл. Когда программа cp хочет записать в файл, она получает ссылку на него из каталога, записывает нулевую длину в метаданные, хранящиеся в каталоге (это небольшое упрощение), и отказывается от дескриптора. Затем исходная программа, по-прежнему удерживая исходный дескриптор файла, записывает в файл еще несколько данных и сохраняет ту длину, которая, по ее мнению, должна быть.

даже если вы удалите файл из каталога, программа продолжит записывать в него данные (и использовать дисковое пространство), даже если никакая другая программа не сможет ссылаться на него.

Короче говоря, если у программы есть ссылка (дескриптор) на файл, ничто из того, что вы делаете, не изменит этого.

Теоретически существуют способы изменения поведения программ путем установки LD_LIBRARY_PATH для включения программы, которая перехватывает все системные вызовы доступа к файлам. Я помню, что где-то видел что-то подобное, но не могу вспомнить название.

3
ответ дан 27 November 2019 в 16:04
поделиться

Попробуйте > файл .


Обновите комментарии: у меня он отлично работает:

robert@rm:~> echo "content" > test-file
robert@rm:~> cat test-file 
content
robert@rm:~> > test-file
robert@rm:~> cat test-file 
8
ответ дан 27 November 2019 в 16:04
поделиться

Интересная особенность этих восстановленных файлов заключается в том, что первые 128 КБ или около того будут содержать все нули после того, как вы усечете файл, скопировав поверх него / dev / null . Это происходит из-за того, что файл усечен до нулевой длины, но дескриптор файла в приложении по-прежнему указывает сразу после его последней записи. При повторной записи файловая система обрабатывает начало файла как все нулевые байты - без фактической записи нулей на диск.

В идеале, вам следует попросить поставщика приложения открыть файл журнала с Флаг O_APPEND . Это означает, что после усечения файла следующая запись будет неявно искать до конца файла (то есть вернуться к нулевому смещению), а затем запишет новую информацию.

27
ответ дан 27 November 2019 в 16:04
поделиться

во время использования файла, если вы попытаетесь обнулить его или что-то в этом роде, иногда это может «сбить с толку» приложение, которое записывает в файл журнала, и после этого оно может ничего не записывать.

Что я бы попробовал сделать, так это настроить своего рода прокси / фильтр для этого журнала, вместо перенаправления в файл, перенаправления на процесс или что-то еще, что будет получать ввод и записывать в текущий файл.

Возможно, это можно сделать с помощью сценария, иначе вы могли бы написать для этого простое приложение (java или что-то еще). Влияние на производительность приложения должно быть довольно небольшим, но вам придется провести несколько тестов.

Кстати, ваше приложение является автономным веб-приложением, ... ? Может быть, есть другие варианты, которые нужно изучить.

Изменить: есть также Оператор перенаправления добавления >> , который я лично никогда не использовал, но он может не блокировать файл.

3
ответ дан 27 November 2019 в 16:04
поделиться

Начиная с coreutils 7.0, появилась команда truncate.

32
ответ дан 27 November 2019 в 16:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: