как проверить хотя бы свободное пространство XG на / var

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

Обычно да, но не обязательно. Представьте себе программу, подобную uniq, но более сложную, которая подсчитывает количество вхождений каждой уникальной строки, полученной на вход. В отличие от uniq, она выводит текущий итог количества вхождений, замеченных на данный момент. Поэтому он считается потоковым, так как производит вывод по мере поступления входных данных. Но если каждая строка входных данных уникальна или близка к этому, ей придется запоминать каждую отдельную строку в структуре данных, чтобы поддерживать бегущий подсчет, и она фактически не сможет обрабатывать файл, который больше памяти.

Также есть ли способ узнать, какие программы поддерживают потоковый ввод/вывод?

Нет, если это не задокументировано или если вы не можете проверить это сами, нет, потому что это зависит от того, что делает программа.

Однако вы можете сделать нечто близкое: вы можете проверить, нужен ли программе входной файл с возможностью поиска. Некоторые программы принимают на вход либо трубку, либо обычный файл (или сокет, или что-то еще). Другие могут принимать только обычный файл. Если программа настаивает на обычном файле с возможностью поиска, то велика вероятность того, что она не делает никаких потоков. Если она позволяет использовать в качестве входных данных трубу, то велика вероятность, что она это делает. Но есть и исключения. Например, sort позволяет использовать трубу в качестве входа, но он не выполняет потоковую передачу: он выводит только то, что находится после конца входного файла.

0
13.03.2018, 11:52
1 ответ

С достаточно новым GNU dfвы можете извлечь только доступное пространство, используя опцию --output. А можно было бы остальное сравнение с awk:

$ df -k --output=avail /var | awk 'NR == 2 && ($1 < 10*2**20) {print "/var need at least 10G"}'
/var need at least 10G

Даже без этого, если вы хотите получить конкретную файловую систему, лучше всего сделать df /varвместо df | grep /var(, если только вы не хотите поймать случай, когда ничего не монтируется на/var).

Для запуска других команд, основанных на этом, с помощью bash используйте (( ))арифметический контекст:

if (( $(df -k --output=avail /var | tail -1) < 10*2**20 ))
then
    log "/var need at least 10G"
fi 
3
28.01.2020, 02:24

Теги

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