AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 512362
Accepted
Ruslan
Ruslan
Asked: 2019-04-14 22:27:15 +0800 CST2019-04-14 22:27:15 +0800 CST 2019-04-14 22:27:15 +0800 CST

Por que o tar parece pular o conteúdo do arquivo quando o arquivo de saída é /dev/null?

  • 772

Eu tenho um diretório com mais de 400 GiB de dados nele. Eu queria verificar se todos os arquivos podem ser lidos sem erros, então uma maneira simples que pensei foi tarem /dev/null. Mas, em vez disso, vejo o seguinte comportamento:

$ time tar cf /dev/null .

real    0m4.387s
user    0m3.462s
sys     0m0.185s
$ time tar cf - . > /dev/null

real    0m3.130s
user    0m3.091s
sys     0m0.035s
$ time tar cf - . | cat > /dev/null
^C

real    10m32.985s
user    0m1.942s
sys     0m33.764s

O terceiro comando acima foi parado à força por Ctrl+ Cdepois de já ter sido executado por um bom tempo. Além disso, enquanto os dois primeiros comandos estavam funcionando, o indicador de atividade do dispositivo de armazenamento que continha .estava quase sempre ocioso. Com o terceiro comando, o indicador fica constantemente aceso, o que significa extrema ocupação.

Então, parece que, quando taré capaz de descobrir que seu arquivo de saída é /dev/null, ou seja, quando /dev/nullé aberto diretamente para ter o identificador de arquivo no qual tarescreve, o corpo do arquivo aparece ignorado. (Adicionar vopção para tarimprimir todos os arquivos no diretório sendo tar'vermelho.)

Então eu me pergunto, por que isso é assim? É algum tipo de otimização? Se sim, então por que iria tarquerer fazer uma otimização tão duvidosa para um caso tão especial?

Estou usando o GNU tar 1.26 com glibc 2.27 no Linux 4.14.105 amd64.

tar null
  • 2 2 respostas
  • 2581 Views

2 respostas

  • Voted
  1. Best Answer
    muru
    2019-04-14T22:45:11+08:002019-04-14T22:45:11+08:00

    É uma otimização documentada :

    Quando o arquivo está sendo criado para /dev/null, o GNU tar tenta minimizar as operações de entrada e saída. O sistema de backup Amanda, quando usado com GNU tar, tem um passo inicial de dimensionamento que usa esse recurso.

    • 25
  2. Guntram Blohm
    2019-04-15T01:51:59+08:002019-04-15T01:51:59+08:00

    Isso pode acontecer com uma variedade de programas, por exemplo, eu tive esse comportamento uma vez ao usar apenas cp file /dev/null; em vez de obter uma estimativa da velocidade de leitura do meu disco, o comando retornou após alguns milissegundos.

    Tanto quanto me lembro, isso foi no Solaris ou AIX, mas o princípio se aplica a todos os tipos de sistemas unix-y.

    Antigamente, quando um programa copiava um arquivo para algum lugar, ele alternava entre readchamadas que pegavam alguns dados do disco (ou o que o descritor de arquivo está se referindo) para a memória (com a garantia de que tudo está lá quando readretorna) e writechamadas (que pegam o pedaço de memória e enviam o conteúdo para o destino).

    No entanto, existem pelo menos duas maneiras mais recentes de alcançar o mesmo:

    • Linux tem chamadas de sistema copy_file_range(não são portáteis para outros Unixes) e sendfile(um pouco portáteis; originalmente destinado a enviar um arquivo para a rede, mas pode usar qualquer destino agora). Eles se destinam a otimizar as transferências; se o programa usa um desses, é facilmente concebível que o kernel reconheça que o alvo é /dev/nulle transforme a chamada do sistema em um não-op

    • Os programas podem usar mmappara obter o conteúdo do arquivo em vez de read, isso basicamente significa "certifique-se de que os dados estejam lá quando tento acessar esse pedaço de memória" em vez de "certifique-se de que os dados estejam lá quando a chamada do sistema retornar". Assim, um programa pode mmapacessar o arquivo de origem e chamar writeesse pedaço de memória mapeada. No entanto, como a gravação /dev/nullnão precisa acessar os dados gravados, a condição "certifique-se de que está lá" nunca é acionada, resultando na não leitura do arquivo.

    Não tenho certeza se o gnut tar usa algum e qual desses dois mecanismos quando detecta que está escrevendo para /dev/null, mas eles são a razão pela qual qualquer programa, quando usado para verificar velocidades de leitura , deve ser executado com | cat > /dev/nullem vez de > /dev/null- e por que | cat > /dev/nulldeveria ser evitado em todos os outros casos.

    • 8

relate perguntas

  • Remova o nome do caminho ao extrair e arquivar arquivos que terminam com .log de /var/log

  • significado de traços nus neste exemplo de curl/tar

  • diretório tar para enviar apenas blocos modificados de arquivos

  • Em Solaris; encontrar, anexar a uma bola de alcatrão e comprimir a pergunta

  • bsdtar: Como evitar sobrescrever as informações do arquivo existente?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve