GNU paralelo e basefile fora do pwd?

3

Estou usando o GNU paralelo para executar transformações pesadas de computação em hosts remotos que são mais poderosos do que aquele que solicita o trabalho.

Estou usando um script bash localizado em /usr/local/lib/myscript e gostaria de usá-lo nos hosts remotos. No entanto, não quero exigir que os hosts tenham esse script, por isso estou enviando-o ao longo do trabalho com --basefile .

Se eu fornecer apenas o nome do arquivo, tudo vai bem. Mas se eu fornecer o caminho completo para um basefile, isso não funcionará.

Para ilustrar:

$ cat /tmp/common.sh
#!/usr/bin/env bash
echo "Hello world! from $(hostname)"

$ cd /tmp
$ parallel --nonall -S 2/user@remote-host --basefile common.sh --cleanup bash common.sh
Hello world! from remote-host

$ parallel --nonall -S 2/user@remote-host --basefile     /tmp/common.sh --cleanup "bash {}"
could not make way for new symlink: tmp
rsync error: some files could not be transferred (code 23) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-47/rsync/main.c(992) [sender=2.6.9]
cannot delete non-empty directory: tmp

Existe uma maneira de usar --basefile com arquivos fora do caminho atual? Ou devo usar um segundo --trc e aproveitar os padrões de substituição {1} e {2} para emular --basefile ?

    
por springloaded 28.11.2016 / 02:23

1 resposta

2

A transferência de arquivos (por exemplo, --basefile, --transfer-file, --transfer, --return ) no GNU Parallel usa rsync 's /./ magic. Então, quando você pedir para transferir /tmp/common.sh , ele será colocado em /tmp/common.sh no lado remoto. Mas se você pedir para transferir /tmp/./common.sh , ele transferirá /tmp/common.sh para $(pwd)/. .

Em outras palavras:

(local file) => (remote file)
dir/file => ./dir/file
/tmp/sub/dir/file => /tmp/sub/dir/file
/tmp/sub/./dir/file => ./dir/file

O erro que você vê provavelmente se deve ao fato de / tmp ser um symlink no sistema remoto.

Se você usar --workdir ... , terá um novo workdir para cada trabalho. Como --basefile apenas copia o arquivo antes que o primeiro trabalho seja executado, isso não funcionará.

Em vez disso, você pode transferir common.sh para cada trabalho:

parallel --wd ... --tf {1} -S server 'pwd ; ls; echo {2}' ::: /tmp/./common.sh ::: foo bar
    
por 28.11.2016 / 14:04