私のクラスタがどのように設定されているかわからない場合は、答えが難しいかもしれませんが、SGEを介してクラスタにジョブを送信しようとしていますが、環境が正しく設定されていないため、ジョブは失敗します。また、2 つの異なるマスターノードにログインして同じクラスタにジョブを送信できます。スクリプトは 1 つのノードで実行されますが、別のノードでは実行されません。
これは私のスクリプトが処理するマスターノードのコンピュータ情報です。
cat /proc/version
Linux version 2.6.32-279.el6.x86_64 ([email protected]) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Wed Jun 13 18:24:36 EDT 2012
働かない機械:
cat /proc/version
Linux version 3.10.0-514.6.2.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Thu Feb 23 03:04:39 UTC 2017
これは私が使用するテストスクリプトです。
#!/bin/bash -I
#$ -wd ~
#$ -N test
#$ -o ~/test.log
#$ -j y
#$ -terse
#$ -V
#$ -notify
#$ -l h_vmem=2G -pe smp 1 -l athena=true
ls
hostname
nproc
これは「qsub test.sh」を実行した後の出力です。
/bin/bash: module: line 1: syntax error: unexpected end of file
/bin/bash: error importing function definition for `BASH_FUNC_module'
/opt/sge/default/spool/execd/node156/job_scripts/1063646: line 11: ls: command not found
/opt/sge/default/spool/execd/node156/job_scripts/1063646: line 12: hostname: command not found
より混乱しているのは、これらの作業ノード(上記の例ではnode156)にSSHを介して直接接続すると、lsコマンドとホスト名コマンドを正しく実行できることです。
クラスタ管理者に連絡しましたが、彼らは私の問題を複製することはできません(彼らが私にログインしているにもかかわらず)。 ~/.bashrc と ~/.bash_profile をデフォルト値に設定すると、問題が解決するかどうかを最初にテストしましたが、そうではありませんでした。ファイルは次のようになります。
cat ~/.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
.bash_config ファイル:
cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
どんな提案がありますか?
答え1
私はSGEについて何も知らないので、完全な解決策はありません。ただし、問題の一部を説明できます。
スクリプトが実行されているコンピュータは、以前のバージョンのオペレーティングシステムを実行しています。これは、カーネルのバージョン番号だけでなく、しばらくのセキュリティアップデートを受け取っていないという事実からもわかります。具体的には、実行中のbashバージョンは次のような影響を受けやすいと思います。シェルショック抜け穴。
Bash(ab) を使う環境配信機能。通常、環境は一連のアイテム形式でデータを渡すためにのみ使用されます。以前のバージョンのbashでは、以下の形式のエントリを追加して、場合によってはスクリプトが絶対に使用しない変数を定義してコードを挿入できるようにしました。NAME=VALUE
NAME=() {CODE}
シェルショック。バグ修正のため、関数のエンコードが 。BASH_FUNC_NAME%%=() {CODE}
明らかに、設定の一部は環境をダンプして解析します。これはSGEの一部である場合も、設定によって異なる場合もあります。これが有効な理由は、ジョブが送信された環境を同じ環境で実行できるように保管することです。
module
bashから呼び出されてエクスポートされる関数はどこかに定義されています。コードは次のとおりです
module () {
…
}
export -f module
回避策は、環境パーサーを新しいbashエンコーディングを処理できるバージョンにアップグレードするか、機能のエクスポートを停止することです。