저는 작업을 요청하는 호스트보다 더 강력한 원격 호스트에서 계산 비용이 많이 드는 변환을 수행하기 위해 GNU Parallel을 사용하고 있습니다.
. 에 있는 bash 스크립트를 사용하고 있으며 /usr/local/lib/myscript
이를 원격 호스트에서 사용하고 싶습니다. 하지만 호스트에게 이 스크립트를 요구하고 싶지 않기 때문에 --basefile
.
파일 이름만 제공하면 모든 것이 잘 됩니다. 하지만 기본 파일의 전체 경로를 제공하면 작동하지 않습니다.
표시하려면:
$ 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
--basefile
현재 경로 외부의 파일을 사용할 수 있는 방법이 있나요 ? 아니면 두 번째 것을 사용 --trc
하고 패턴 사용 {1}
및 교체를 {2}
시뮬레이션 해야 합니까 --basefile
?
답변1
--basefile, --transfer-file, --transfer, --return
GNU 병렬(예:)의 파일 전송은 rsync
/./ 매직을 사용합니다. 따라서 전송을 요청하면 원격 측 /tmp/common.sh
에 전송됩니다 . /tmp/common.sh
하지만 전송을 요청하면 으로 /tmp/./common.sh
전송됩니다 ./tmp/common.sh
$(pwd)/.
다시 말해서:
(local file) => (remote file)
dir/file => ./dir/file
/tmp/sub/dir/file => /tmp/sub/dir/file
/tmp/sub/./dir/file => ./dir/file
현재 보고 있는 오류는 원격 시스템의 심볼릭 링크인 /tmp로 인해 발생할 수 있습니다.
를 사용하면 --workdir ...
각 작업에 새로운 작업 디렉터리가 생깁니다. --basefile
파일은 첫 번째 작업이 실행되기 전에만 복사되므로 작동 하지 않습니다.
대신 각 작업에 대해 common.sh를 전송할 수 있습니다.
parallel --wd ... --tf {1} -S server 'pwd ; ls; echo {2}' ::: /tmp/./common.sh ::: foo bar