SLURMジョブを実行すると、sbatch
slurmはslurm-102432.out(slurm-jobid.out)に似た標準出力ファイルを生成します。 (yyyymmddhhmmss-jobid-jobname.txt)でカスタマイズしたいです。どうすればいいですか?
sbatch
または、より一般的には、パラメータに計算された変数を含めるにはどうすればよいですか-o
?
script.shで次のことを試しました。
#SBATCH -p core
#SBATCH -n 6
#SBATCH -t 1:00:00
#SBATCH -J indexing
#SBATCH -o "/home/user/slurm/$(date +%Y%m%d%H%M%S)-$(SLURM_JOB_ID)-indexing.txt"
しかし、それはうまくいきませんでした。新しいディレクトリ内のファイルの場所は正確ですが、ファイル名は文字通りの行です$(date +%Y%m%d%H%M%S)-$(SLURM_JOB_ID)-indexing.txt
。
/home/user/slurm/
だから私は、次のようなファイル名を持つディレクトリに標準出力ファイルを保存する方法を探しています。20160526093322-10453-indexing.txt
答え1
これは私が以前の答えで結論を下したものです。
%j
ジョブIDの提供%x
役職を与える- 必要な形式で日付を取得する方法がわかりません。ジョブIDは実行中に一意の識別子として機能し、ファイル変更日は将来の分析のために日付をキャプチャします。
私のSBATCH魔法は次のとおりです。
#SBATCH --output=R-%x.%j.out
#SBATCH --error=R-%x.%j.err
R-
すべてのアイテムを簡単に移動または削除できるように、プレフィックスとして追加することをお勧めします。R-*
答え2
少なくともあなたが望む方法ではできません。この#SBATCH
行はコマンドによって解釈されるシェルコメントでありsbatch
、ここではシェルコードを実行できません。
また、sbatch
オプション-o
は非常に制限された代替シンボルセットのみを理解します(以下の抜粋のマンページを参照)。
おそらく必要なものに最も近い方法は、sbatch
ジョブID、ジョブ名、現在の日付と時刻をテキストファイル(たとえばtimestamp<TAB>jobid<TAB>jobname
)に追加するラッパースクリプトで実行し、次を使用することです。作業が完了した後出力ファイルの名前を変更します。
time_tまたは「epoch以降の秒」は、date +%s
スクリプトで最も便利な日付/時刻形式です。まず、解析しなくても簡単に印刷できます。
squeue -t BF,CA,CD,F,NF,PR,TO
そのテキストファイルを通過して実行されなくなり(検査を使用して)、名前が変更されていない各ジョブIDの名前を変更するスクリプトを作成することは難しくありません。
ちなみに、マニュアルページには次のようにsbatch
記載されています。
-o, --output=
バッチスクリプトの標準出力を「ファイル名パターン」で指定されたファイル名に直接関連付けるようにSlurmに指示します。デフォルトでは、標準出力と標準エラーの両方が同じファイルに渡されます。ジョブ配列の場合、デフォルトのファイル名はであり、
slurm-%A_%a.out
ジョブIDと配列インデックスに置き換えられます%A
。%a
他のジョブの場合、デフォルトのファイル名はslurm-%j.out
ジョブ%j
IDに置き換えられます。--input option
ファイルの命名オプションについてはを参照してください。
そして-i
次のように書かれているからです。
-i, --input=
バッチスクリプトの標準入力を「ファイル名パターン」で指定されたファイル名に直接接続するようにSlurmに指示します。デフォルトでは、バッチスクリプトは標準入力で開き、標準出力と標準エラーの両方は、以下に説明するようにジョブ割り当て番号に置き換えられた名前
/dev/null
のファイルに渡されます。slurm-%j.out
%j
%
ファイル名パターンには、パーセント記号の後に文字が続く1つ以上の代替記号を含めることができます%j
。サポートされる代替記号は次のとおりです。
%A Job array's master job allocation number. %a Job array ID (index) number. %j Job allocation number. %N Node name. Only one file is created, so %N will be replaced by the name of the first node in the job, which is the one that runs the script. %u User name.
答え3
このコマンドのドキュメントは、sbatch
許容される文字置換の完全なリストを提供します。スバッチのマニュアルページ
ファイル名パターン sbatchを使用すると、ファイル名パターンに1つ以上の代替記号(たとえば、パーセント記号「%」の後に文字(%jなど))を含めることができます。
\\ 代替記号を処理しないでください。
%% 数値「%」。
%Aジョブ配列のデフォルトのジョブ割り当て番号。
%aタスク配列ID(インデックス)番号。
%J実行中のジョブのjobid.stepid。 (例:「128.0」)
実行中のジョブの%jジョブID。
%N短いホスト名。これにより、各ノードに対して別々のIOファイルが作成されます。
%n現在のジョブに関連付けられているノード識別子(「0」は実行中のジョブの最初のノードです。)これにより、各ノードに対して別々のIOファイルが作成されます。
%s 実行中のジョブの stepid。
%t現在のジョブに相対的なジョブ識別子(ランク)。これにより、ジョブごとに別々のIOファイルが作成されます。
%uユーザー名。
%xジョブ名。
パーセント記号文字と書式指定子の間の数字を使用して、IOファイル名の結果をゼロで埋めることができます。書式指定子が数値以外のデータ(%Nなど)に対応する場合、この数値は無視されます。
以下のリストは、ジョブIDが128でステップIDが0の4タスクジョブステップにフォーマット文字列を使用する方法の例です。
日%J.アウト
job128.0.out
タスク %4j.out
ジョブ0128.out
ジョブ %j-%2t.out
job128-00.out、job128-01.out、...
答え4
これはやや興味深い新しい答えです。このプロセス中にログファイルの名前を変更することはできず、後で変更することはsbatchコマンドをより多くのコードでラップする必要があるため理想的ではありません。代わりに、sbatchログファイルに「リンクされた」目的の名前で新しいログファイルを作成します。ログファイルは目的の名前を持ち、sbatchログファイルが更新されると更新されます。コードの最後からsbatchログファイルを削除すると、リンクされたファイルのみが残ります。もちろん、プロセスの実行中に2つのログファイルがありますが、これは悪くありません。
#SBATCH -o something%j.log
[...]
ln -f something${SLURM_JOB_ID}.log coolName.log
[...]
rm something${SLURM_JOB_ID}.log