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 / 550315
Accepted
golimar
golimar
Asked: 2019-11-05 06:43:23 +0800 CST2019-11-05 06:43:23 +0800 CST 2019-11-05 06:43:23 +0800 CST

Vários processos redirecionando para o mesmo arquivo com >

  • 772

Esta não é uma pergunta "como anexar e não substituir". Não estou procurando um arquivo que combine a saída de dois comandos. É apenas um erro que cometi e gostaria de entender por que o sistema fez o que fez

Eu uso um comando (em uma linha de comando ssh remota) que leva muito tempo para ser concluído e gera dados (linha por linha a cada poucos segundos) para stdout, então redireciono para um arquivo:

command > file.out &

Às vezes, a sessão remota é desconectada, mas o comando continua sendo executado em segundo plano. Eu não sabia disso, então executo o mesmo comando novamente, antes que o primeiro tenha terminado :

command > file.out &

Quando ambos os processos terminarem, eu esperaria ter (depois de ler algumas respostas neste site) um único arquivo com as linhas de ambos os comandos bagunçadas, mas o arquivo de saída só tem a saída de uma das 2 execuções.

Por que o arquivo não tem as duas saídas entrelaçadas (como avisado nos comentários aqui )? A qual das 2 saídas pertence o arquivo final?

EDITAR:

Removida uma das perguntas (por que o arquivo de saída não está bloqueado para gravação?) conforme explicado aqui

bash
  • 1 1 respostas
  • 2432 Views

1 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2019-11-05T07:38:53+08:002019-11-05T07:38:53+08:00

    Quando você abre um arquivo para escrita usando o >redirecionamento, o arquivo fica truncado , ou seja, está completamente vazio. No entanto, não é excluído e recriado.

    Se um comando começar truncando o arquivo e depois gravar algo nele, e se outro comando fizer o mesmo, a posição do primeiro comando dentro do arquivo não será alterada. Isso significa que você tem dois comandos gravando no mesmo arquivo em duas posições independentes, um possivelmente substituindo a saída do outro, dependendo da ordem de gravação e da quantidade de dados sendo gravados .

    Então, sim, os dados no arquivo podem ser uma confusão entrelaçada da saída de ambos os programas, mas dependerá da ordem das gravações no arquivo, bem como da quantidade de dados gravados e do tempo dos truncamentos de o arquivo.

    Aqui está um exemplo de entrelaçamento dos dados de dois comandos:

    #!/bin/sh
    
    ( { echo hello; sleep 2; echo world; } | cat >file ) &
    sleep 1
    echo 123 >file &
    
    wait
    

    Isto é o que acontece neste script:

    1. O primeiro comando abre o arquivo para escrita e o trunca. Ele escreve hello\npara ele.
    2. Após um segundo, o segundo comando trunca o arquivo e grava 123\nnele. Neste ponto, o ponteiro de arquivo do primeiro comando ainda está apontando para o arquivo em algum deslocamento.
    3. O primeiro comando continua gravando world\nno arquivo.

    O resultado é um arquivo com um trecho de caracteres nulos no meio:

    $ hexdump -C file
    00000000  31 32 33 0a 00 00 77 6f  72 6c 64 0a              |123...world.|
    0000000c
    

    O nuls ( 00na saída acima) vem do fato de que o ponteiro de arquivo do primeiro comando não foi redefinido pelo truncamento do arquivo do segundo comando, então houve um "buraco" criado. O segundo comando apenas escreveu 123\n, mas teria sobrescrito os nuls se tivesse escrito mais dados:

    $ hexdump -C file
    00000000  31 32 33 35 36 37 77 6f  72 6c 64 0a              |123567world.|
    0000000c
    

    Aqui eu fiz o segundo comando echo 1234567890, mas apenas o 1234567é deixado no arquivo. Isso ocorre porque o primeiro comando continua a gravar world\nno ponto em que seu ponteiro de arquivo estava depois que o segundo comando terminou de gravar.

    • 10

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

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