0

クラスター上のSLURMにジョブを送信するための次の Bash スクリプトがあります。

#!/bin/bash
#SBATCH -A 1234
#SBATCH -t 2-00:00 
#SBATCH -n 24

module add xxx
srun resp.com

#SBATCH行は SLURM コマンドです。

  • #SBATCH -A 1234はプロジェクト番号 (1234)
  • #SBATCH -t 2-00:00仕事の時間です
  • #SBATCH -n 24はコア数

module add xxx環境モジュール をロードしますxxx(この場合、私は実際に を使用していますmodule add gaussian。ここgaussianで、 は計算量子化学プログラムです)。

srunジョブを起動する SLURM コマンドです。resp.comガウス座標と原子座標のコマンドが含まれています。

Bash スクリプトを次の Perl スクリプトに変換しようとしましたが、うまくいきませんでした。Perlでこれを行うにはどうすればよいですか?

#!/usr/bin/perl 

use strict;
use warnings;
use diagnostics;

system ("#SBATCH -A 1234");
system ("#SBATCH -t 2-00:00");
system ("#SBATCH -n 24");

system ("module add xxx");
system ("srun resp.com ");
4

2 に答える 2

3

system呼び出しは、問題のプログラムを実行する子プロセスを作成し、子プロセスが終了すると戻ります。

全体のポイントはmodule、とりわけ環境を変更することにより、現在のシェルを構成することです。このプロセスが完了する (死ぬ) と、それらの変更に別れを告げます。への呼び出しはsrun、新しい環境を備えた新しいプロセスであり、チャンスがありません。

次のステップ:

  • SLURM と bash を理解し、その正確な理由が役に立たないsystem("#SBATCH whatever");可能性があることを理解してください。ヒント: Bash と Perl の両方でコメントの開始を示します。#
  • Perl インタープリター内のシェル内で何をしているのか、またシェル内で何をしているのかをどのように再現できるかをmodule add理解してください。xxxThisSuitIsBlackNot はuse Env::Modulecmd { load => 'foo/1.0' };、この機能を再現することを推奨しています。
  • をまったく理解していなければmodule addsystem ('module add xxx; srun resp.com')これら 2 つのコマンドを同じシェル プロセスに配置することになりますが、この時点で、Perl インタープリターをミックスに追加することで何が得られたかを自問する必要があります。
于 2015-02-17T20:57:36.107 に答える