Linux環境で以下の事象が発生します。原因と対処方法を教えてください。
(事象1)
単位ジョブを実行すると常に以下のメッセージが標準エラー出力に出力されます。(単位ジョブ自体は正常終了します)
bash: which: 行 1: 構文エラー: 予期しないファイル終了 (EOF) です
bash: `which' の関数定義をインポート中にエラーが発生しました
bash: which: 行 1: 構文エラー: 予期しないファイル終了 (EOF) です
bash: `which' の関数定義をインポート中にエラーが発生しました
(事象2)
CL/Winの「他のユーザのフレーム」からジョブネットワークを即時投入すると以下のエラーが発生し、投入に失敗します。
(事象3)
jnwsubmitcmdコマンドにおいて-uオプションで他のユーザを指定して実行すると以下のエラーが発生し、ジョブネットワークの投入に失敗します。
$ /usr/lib/nqs/gui/bin/jnwsubmitcmd -u jcuser NewJnw
JNWMAN:pipe_execv:/usr/lib/nqs/gui/bin/jnwenvfile error return = <1>
【原因】
この事象は、シェル関数を環境変数として設定する機能(以下、関数エクスポート機能と表記)を利用することで、JobCenterがサポートしていない複数行の値を持つ環境変数が生成されることによって発生します。
特に、RHEL8.5以降では which のパッケージで、プロファイルを通して関数がエクスポートされるようになったため、以下の環境変数が設定されます。そのため、RHEL8.5以降では事象が必ず発生します。
BASH_FUNC_which%%=() { ( alias;
eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot "$@"
}
なお、RHEL8.4以前でも「yum update」等によりwhichを更新すれば同じ状態になり、事象が発生します。
関数エクスポート機能の利用状況は、env | grep BASH_FUNC を実行することで確認できます。
上記 BASH_FUNC_xxx のような内容が表示されれば関数エクスポート機能を利用しています。
本事象はRHEL環境、Oracle Linux環境で発生が確認されていますが、他のOSでも複数行の値を持つ環境変数が定義された場合は同様の事象が発生します。
【対処方法】
以下のバージョンでは修正パッチの適用によって事象が発生しなくなります。
R15.5.x: R15.5.2以降
R16.1.x: R16.1.1以降
修正パッチにつきましては、サポート契約をした方のみパッチをダウンロードできます。
関連情報から入手してください。
それ以外のバージョンでは、ジョブネットワークを所有しているユーザのhomeディレクトリに「.nsifrc」ファイルを新規作成し、関数エクスポート機能で作成される環境変数を打ち消す設定(unset -f 関数名)を追加します。
問合せの例では「unset -f which」を設定します。
関数エクスポート機能で複数の環境変数が設定されている場合は
「unset -f $(env | grep -oP "^BASH_FUNC_\K([^%]*)")」
のように設定することもできます。
「.nsifrc」ファイル作成後にCL/Winからジョブネットワークを所有しているユーザで再接続すれば事象が解消されます。
※「.nsifrc」は単位ジョブで利用する環境変数を設定するためのファイルです。
詳細は「環境構築ガイド」の「15.1.3.5. JobCenter MG側で設定する場合の対処」(R15.5の場合)を参照してください。
ただし、jnwsubmitcmd コマンドにより、コマンド実行者のジョブネットワークを実行する場合に限り、この対処を行なっても事象1が発生します。
これを回避するには、以下のように -u と -r オプションにより、ジョブネットワークを所有しているユーザ名とサイト名を明示的に指定してください。
jnwsubmitcmd -u <ユーザ名> -r <サイト名> <ジョブネットワーク名>
※-r はリモートサーバ上に存在するジョブネットワークを投入する場合のオプションですが、このオプションを指定することで事象1が回避できます。