ZFS Enviar para Pigz, para netcat

3

Estou escrevendo um script que abre um processo netcat remotamente em um servidor que ouve entradas e redireciona para um arquivo:

ssh $remote_upload_user@remote_upload_address "nc -l -p $remote_port > $remote_dir/$backup.gz&"

O script prossegue para compactar a captura instantânea do ZFS por meio de pigz e, em seguida, envia os dados como entrada para netcat :

netcat $remote_upload_address -u $remote_port < $(zfs send -R $zpool@label | pigz)

Ao adicionar |pv ao final de pigz (entre parênteses), ele mostra que pigz está processando os dados, mas quando os dados passam para netcat , recebo um fluxo sem fim de inundação de dados distorcidos stdout no lado do cliente.

O servidor mostra o tamanho 0 em aumento para o arquivo para o qual ele precisa estar gravando. Por que isso não está funcionando?

    
por Amish 06.02.2017 / 17:11

1 resposta

6

$(...) é a substituição de comando. Você não quer que a saída de zfs send seja tomada como um nome de arquivo para nc ler. Você deseja enviar a saída de zfs send como entrada para pigz , enquanto pigz envia sua saída para netcat , portanto:

zfs send -R "$zpool@label" | pigz | netcat "$remote_upload_address" "$remote_port"

Não use o UDP. UDP, ao contrário do TCP, não oferece garantia de entrega.

Se você quiser usar o operador de redirecionamento < , poderá usar a substituição ksh -style processo (também encontrada em zsh e bash ):

netcat "$remote_upload_address" "$remote_port" < <(
  zfs send -R "$zpool@label" | pigz)

Mas isso não tem vantagem sobre o equivalente padrão | . Lá, o nome do arquivo passado ao operador de redirecionamento < é um canal nomeado ou /dev/fd/x especial que aponta para um canal ( pigz escrevendo na outra extremidade do canal).

É o mesmo, mas envolve algumas chamadas extras ao sistema. Outra diferença é que o shell não espera pelo comando zfs send|pigz (embora espere por netcat , que provavelmente não terminará antes de pigz quando estiver lendo sua saída).

Ou use o operador de redirecionamento de processo de yash :

netcat "$remote_upload_address" "$remote_port" <(
  zfs send -R "$zpool@label" | pigz)

Mais uma vez, não há vantagem sobre a sintaxe padrão aqui. Você normalmente usaria o redirecionamento de processo em yash quando quiser ter vários fds de um comando conectado a pipes para outros comandos.

    
por 06.02.2017 / 17:28

Tags