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 / 472117
Accepted
Josh
Josh
Asked: 2018-09-29 08:38:44 +0800 CST2018-09-29 08:38:44 +0800 CST 2018-09-29 08:38:44 +0800 CST

Como posso executar vários comandos pv em paralelo?

  • 772

Eu quero executar uma sequência de pipelines de comando pvem cada um. Aqui está um exemplo:

for p in 1 2 3
do
  cat /dev/zero | pv -N $p | dd of=/dev/null &
done

Os comandos reais no pipe não importam ( cat/ ddsão apenas um exemplo)...

O objetivo é 4 pipelines em execução simultânea, cada um com sua própria pvsaída. No entanto, quando tento fazer os comandos em segundo plano como este, pvpara e tudo o que recebo são 4 trabalhos parados. Eu tentei com {...|pv|...}&, bash -c "...|pv|..." &todos com o mesmo resultado.

Como posso executar vários pvpipelines de comando simultaneamente?

shell parallelism
  • 2 2 respostas
  • 1614 Views

2 respostas

  • Voted
  1. Best Answer
    Josh
    2018-09-29T08:45:21+08:002018-09-29T08:45:21+08:00

    Descobri que posso fazer isso com xargse a -Popção:

    josh@subdivisions:/# seq 1 10 | xargs -P 4 -I {} bash -c "dd if=/dev/zero bs=1024 count=10000000 | pv -c -N {} | dd of=/dev/null"
            3: 7.35GiB 0:00:29 [ 280MiB/s] [                                                                                         <=>                                                                 ]
            1: 7.88GiB 0:00:29 [ 312MiB/s] [                                                                                         <=>                                                                 ]
            4: 7.83GiB 0:00:29 [ 258MiB/s] [                                                                                         <=>                                                                 ]
            2: 6.55GiB 0:00:29 [ 238MiB/s] [                                                                                         <=>                                                                 ]
    

    Envie a saída da matriz para iterar em stdin de xargs; Para executar todos os comandos simultaneamente, use-P 0

    • 7
  2. mosvy
    2018-09-29T13:15:35+08:002018-09-29T13:15:35+08:00

    pvnão pode ser iniciado em segundo plano.

    Como você pode ver no src/main/main.carquivo do pvcódigo-fonte do , eles estão definindo o TOSTOPsinalizador no terminal com tcsetattr()(no c.c_lflagda termiosestrutura). Eles estão fazendo isso para receber um SIGTTOUao tentar escrever no terminal quando não estiver em primeiro plano, pegá-lo com um manipulador de sinal e redirecionar a saída para /dev/nullnão "estragar" o terminal.

    /*
     * Set terminal option TOSTOP so we get signal SIGTTOU if we try to
     * write to the terminal while backgrounded.
     *
     * Also, save the current terminal attributes for later restoration.
     */
    memset(&t, 0, sizeof(t));
    tcgetattr(STDERR_FILENO, &t);
    t_save = t;
    t.c_lflag |= TOSTOP;
    tcsetattr(STDERR_FILENO, TCSANOW, &t);
    

    Obviamente, isso é nojento, porque não define esse sinalizador apenas para si, mas para todos os programas que usam o terminal.

    Mas isso não é tudo. Conforme explicado no manual da glibc :

    Função: int tcsetattr (int fieldes, int when, const struct termios *termios-p)

    Se esta função for chamada a partir de um processo em segundo plano em seu terminal de controle, normalmente todos os processos do grupo de processos recebem um sinal SIGTTOU, da mesma forma como se o processo estivesse tentando escrever no terminal. A exceção é se o próprio processo de chamada estiver ignorando ou bloqueando os sinais SIGTTOU, caso em que a operação é executada e nenhum sinal é enviado. Consulte Controle de Trabalho.

    Eles não estão bloqueando ou ignorando o SIGTTOU. E eles também não estão verificando o valor de retorno de tcsetattr()(que retornaria -1 e definido errnocomo EINTR se eles tivessem definido o SIGTTOUmanipulador de sinal antes).

    Assim, o processo é interrompido. Se receber um SIGCONT(a partir do bgcomando), ele irá parar novamente ao tentar completar o tcsetattr().

    Então eu acho que você deve considerá-lo um recurso ;-)

    • 4

relate perguntas

  • Como funciona este comando? mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

  • FreeBSD's sh: funções de lista

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • o que grep -v grep faz

  • Como salvar um caminho com ~ em uma variável?

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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