1

問題

クラスターでの自動化されたバッチ ジョブの実行に役立つ一連のスクリプトを作成しています。私が持っている特定のものは$OUTPUT_DIR、および任意の$COMMANDです。出力が
になるように を実行したいと思います。たとえば、 の場合、最終結果が と同等になるように実行したいと思います。理想的には、ソリューションは次のようになりますが、うまくいきません。$COMMAND$OUTPUT_DIRCOMMAND='cp ./foo ./bar; mv ./bar ./baz'cp ./foo ./$OUTPUT_DIR/bazeval PWD="./$OUTPUT_DIR" $COMMAND

既知の解決策

【そして彼らの問題】

  • 編集$COMMAND: ほとんどの場合、コマンドはスクリプト、またはコンパイル済みの C または FORTRAN 実行可能ファイルになります。これらの内部を変更することはオプションではありません。
  • unionfs、aufs など: これは基本的には完璧ですが、これを実行しているユーザーは root を持っておらず、何千もの任意のマウントを引き起こすのは疑わしい選択のようです。
  • コピー/ハード/ソフトリンク: これは私が使用しなければならない解決策かもしれません: コンテンツ全体を実際に複製するいくつかの./種類./$OUTPUT_DIR
  • cd $OUTPUT_DIR; ../$COMMAND: ファイルを読み取ると失敗$COMMANDします
  • pipes :$COMMANDファイルを直接操作しない場合にのみ機能します。それが通常行うこと

私が見逃している別の解決策はありますか、それともこのリクエストは実際には不可能ですか?

[編集:]選択されたソリューション

ディレクトリ内の各オブジェクトが出力ディレクトリにシンボリック リンクされ、そこからコマンドが実行されるものを使用します。これには、多くのシンボリック リンクが作成されるという欠点がありますが、それほど悪くはありません。

4

2 に答える 2

2

のインターフェースについていくつかの仮定をせずにこれを解決することはできません$COMMAND。「出力が最終的に」が何を$OUTPUT_DIR意味するかについての単一の定義はありません。あるプログラムの場合、これはいくつかのファイルである可能性がありますが、別のプログラムは単に何かをstdoutに出力し、さらに別のプログラムは何らかのプロトコルを使用してインターネット経由でデータを送信しようとしたり、GUIで何かを表示したりする可能性があり、すべてをマッピングする明確な方法はありません。これらを「出力に行く$OUTPUT_DIR」に。

$COMMANDしたがって、いくつかの仮定を考案し、それらに従うための実装を要求する必要があります。次に、コマンドが。などのパラメータを受け入れるように要求するのと同じくらい簡単になる場合があります--target=<DIR>。コマンドが単純なコマンドである場合は、そのパラメーターをアプリが受け入れるものに変換するために、その周りにラッパースクリプトを作成する必要があります。cpmvおよびさらにいくつかのutilsはすでにパラメータを受け入れている--targetので、それは良い出発点かもしれません。

于 2012-05-15T08:52:55.317 に答える
2

出力ディレクトリは設定できません。設定できるのは作業ディレクトリのみです。

問題は、作業ディレクトリを設定すると、他の参照が無効になることです。たとえば、あなたのコードではfoo

cp ./foo ./bar

特定のコマンドがある場合、回避策があります(引数を変更するスクリプトを作成し、特定の引数の前にディレクトリを追加します)が、一般的にこれは不可能です。

于 2012-05-15T08:53:30.443 に答える