私の状況は次のとおりです
私は名前がtimestep1_i
iの多くの値を表す多くのファイルを持っており、timestep1のすべてのファイルをというプログラムとマージしようとしていますcombinefiles
。 find | xargsを使用してこれを並列に実行する(timestep2 timestep3...)。
これには、「combine_and_move」という bash 関数があります。
function combine_and_move {
file_name1=`echo $1 | sed 's/timestep1_0/timestep1/'`
echo "*** file $file_name1 ***"
$UTIL_DIR/combinefiles $file_name1 && mv "$file_name1"_* uncombined_files
}
export -f combine_and_move
この関数はファイル名を受け取り、すべてのファイルを結合し、すでに結合されているファイルを別のディレクトリに移動するプログラムを呼び出します。最後の部分は歌演出を引き受けたそうです&&
。
次に、次のようにfind xargsを使用して関数を呼び出します。
find . -maxdepth 1 -name 'timestep*_0' -print0 | xargs --replace=@ -0 -P 64 bash -c 'combine_and_move $"@"' _ &
システム管理者がプロセスをランダムに終了できることを理解してください。
uncombined_files
機能は機能しますが、時々プロセスが終了すると、そのフォルダにファイルが移動することがあります。明らかに、最初のコマンドが成功しなくても、2番目のコマンドが実行されることを意味します。。
私は何が間違っていましたか?combinefiles
プログラムが成功した場合にのみ、merge_and_move関数にファイルを移動させるにはどうすればよいですか?
答え1
マージファイルが完了したら、成功したかどうかにかかわらず戻りコードを生成する必要があります。 mv コマンドを実行する前に、この戻りコードをテストしてください。
たとえば、シェルで "echo$?" を実行すると、前のコマンドの戻りコードを表示できます。正常な実行の場合は0が表示されますが、CTRL-C(SIGINT)で停止したコマンドの場合は130が表示されます。多くの終了コードをテストし、その値を指定してからmvを実行するかどうかを決定できます。独自の終了コードを指定することもできます。
おそらく、次のリンクが役に立ちます。
https://tldp.org/LDP/abs/html/exit-status.html
https://www.cyberciti.biz/faq/bash-get-exit-code-of-command/