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 / computer / Perguntas / 1740428
Accepted
Sridhar Sarnobat
Sridhar Sarnobat
Asked: 2022-09-03 13:14:24 +0800 CST2022-09-03 13:14:24 +0800 CST 2022-09-03 13:14:24 +0800 CST

Os shell pipes bloqueiam os processos de origem upstream se o buffer estiver transbordando?

  • 772

Realizo várias tarefas sysadmin para limpar meus discos, como (mas não limitado a):

find /media/me/disk_with_huge_inode_count -type d -empty | xargs rmdir -p

e a rmdirpeça é muito lenta, enquanto findproduz uma enorme quantidade de saída em comparação.

Qual seria o comportamento do findsob tal cenário?

Não procuro aconselhamento específico para esta operação porque tenho esta preocupação com outros trabalhos semelhantes. O que eu quero entender é como o kernel Linux (ou shell?) lida com estouros de pipeline quando o produtor e o consumidor têm uma incompatibilidade de carga.

linux bash
  • 1 1 respostas
  • 61 Views

1 respostas

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2022-09-03T16:36:18+08:002022-09-03T16:36:18+08:00

    Caso específico

    Sim, findbloqueará pelo tempo que for necessário. Um teste "simples" é como:

    find / -print -exec sh -c 'printf "%s\\n" "$1" >/dev/tty' find-sh {} \; \
    | while </dev/tty read user_input; do read from_find; done
    

    Aqui estão os find -printnomes de caminho para um pipe ( findno seu código faz o mesmo, ele usa implícito -print). Cada nome de caminho é impresso adicionalmente em /dev/tty, para que você o veja depois -print de ser bem- sucedido. Em algum momento a saída que você vê irá bloquear, é quando o buffer do pipe está (quase) cheio. Pressione Enterpara disparar read from_finda leitura do tubo e liberar espaço no buffer.

    Provavelmente você precisará pressionar várias vezes Enter(na prática é bom segurar e ser paciente) até findimprimir outro monte de nomes de caminho para /dev/tty. No entanto, ao não pressionar, Entervocê pode findbloquear por um tempo arbitrariamente longo.


    Caso Geral

    Você escreveu:

    Eu quero entender é como o kernel Linux (ou shell?)

    O shell é responsável por configurar as coisas: criar processos com descritores (incluindo descritores padrão: stdin, stdout, stderr) conectados aos respectivos arquivos (fifos sem nome, ou seja, pipes; ou arquivos de outros tipos ). Os dados que fluem por um tubo entre processos (como seu finde xargs) não fluem pelo shell. O shell não atua como um relé.

    Para entender como os estouros de pipeline são tratados, em geral, você pode obter algumas informações dos seguintes fragmentos da especificação POSIX dewrite() :

    DESCRIÇÃO

    […]

    As solicitações de gravação em um pipe ou FIFO devem ser tratadas da mesma maneira que um arquivo comum com as seguintes exceções:

    […]

    • Se o O_NONBLOCKsinalizador estiver limpo, uma solicitação de gravação pode fazer com que o encadeamento bloqueie, mas na conclusão normal, ele retornará nbyte.

    • Se o O_NONBLOCKsinalizador estiver definido, write()as solicitações devem ser tratadas de maneira diferente, das seguintes maneiras:

      • A write()função não deve bloquear o thread.

      […]

    […]

    ERROS

    […]

    [EAGAIN]
    O arquivo é um pipe ou FIFO, o O_NONBLOCKsinalizador é definido para o descritor de arquivo e o encadeamento seria atrasado na operação de gravação.

    […]

    JUSTIFICAÇÃO

    […]

    Uma tentativa de gravar em um pipe ou FIFO tem várias características principais:

    […]

    • Bloqueio/imediato: O bloqueio só é possível com O_NONBLOCKclear. Se houver espaço suficiente para que todos os dados solicitados sejam gravados imediatamente, a implementação deve fazê-lo. Caso contrário, o thread de chamada pode bloquear; ou seja, faça uma pausa até que haja espaço suficiente para escrever. […]

    […]

    Isso significa que um thread de escrita pode:

    • definido O_NONBLOCKe em caso de espaço insuficiente no buffer, ele obterá [EAGAIN], poderá continuar (com outras tarefas) e, eventualmente, tentar escrever novamente; ou
    • claro O_NONBLOCKe em caso de espaço insuficiente no buffer, ele será bloqueado.

    Se uma thread de um programa usa write()com O_NONBLOCKset, o programa deve rastrear o que foi escrito com sucesso e o que requer outra tentativa. Com O_NONBLOCKclear, um buffer de pipe estar cheio não é uma preocupação: o thread apenas usa write()e fica bloqueado pelo tempo que for necessário; esse bloqueio acontece write()e não requer nenhum esforço adicional (código), como polling, trap ou qualquer coisa.

    read()pode bloquear como write(), a situação é bastante semelhante e não vou elaborar separadamente.

    Esse design permite que os programas usem tubos de maneira confiável e fácil. A ideia do pipe é que os escritores esperam por espaço no respectivo buffer, os leitores esperam por algo no respectivo buffer; assim, os dados acabarão fluindo mesmo se houver um gargalo.

    É possível escrever um programa impaciente que sairá se não conseguir escrever (quase) imediatamente (ou ler, no caso de um leitor). Programas projetados para trabalhar com tubos devem ser infinitamente pacientes. As ferramentas padrão *nix (incluindo find) por design são infinitamente pacientes¹. É preciso um esforço adicional para criar um programa impaciente ou envolver uma ferramenta padrão do paciente em algo que implemente um tempo limite.

    O impasse pode acontecer se o "encanamento" for circular ( exemplo ) ou se ele se ramificar e convergir posteriormente (como aqui ). É um problema separado que tem pouco (ou nada) a ver com a rapidez com que os programas processam dados. Não ocorre em um arranjo linear de tubos.

    Consideramos as especificações POSIX de write()e read(). O Linux é classificado como "principalmente compatível com POSIX" . Não é "totalmente compatível", mas não espero que se desvie significativamente do POSIX na área em questão. Tubos de trabalho confiável são muito importantes.

    ¹ Não espero que as implementações consigam bloquear até o fim do Universo, ou além do ano 2038 ou 2147485547 . Por "programa infinitamente paciente" quero dizer um programa que não é deliberadamente impaciente por si só.


    Conclusão

    Seu comando está bem como um pipeline. (É falho por outro motivo, veja abaixo.)


    Nota

    Você find … | xargs rmdir -pse comportará mal para nomes de caminho contendo espaços em branco (como espaços), novas linhas, aspas simples ou duplas, barras invertidas. Isso ocorre porque xargssem opções específicas interpreta estes.

    Uma maneira confiável é por find … -print0 | xargs -0 …ou por find … -exec …. Este último é portátil.

    find /media/me/disk_with_huge_inode_count -type d -empty -exec rmdir -p {} +
    

    (AFAIK findtambém é infinitamente paciente ao esperar para -execterminar.)

    • 3

relate perguntas

  • Notificar-enviar notificações aparecendo na janela

  • execute o contêiner do docker como root

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • Como alterar permanentemente Ctrl + C para Ctrl + K no CentOS 7?

  • como abrir um arquivo de escritório do WSL

Sidebar

Stats

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

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

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