私は、タスクを要求するホストよりも強力なリモートホストで計算コストの高い変換を実行するために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
現在のパス以外のファイルを使用する方法はありますか?それとも2番目のものを使用--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