Relionからジョブ管理システムOpenPBSにジョブを投入すると失敗します.
OpenPBSのバージョンにも寄りますが、v19.1.1以降はダメみたい.
大丈夫なのは 14.1.2 と 18.1.4
原因はOpenPBSがジョブ名称[-N]に「/(スラッシュ)」を含むと「変な文字がありますよ」ってエラーにするため.
Relionの「Running」タブで「Queue submit command」でジョブ名称を上書きするように
「qsub -N 2DClass」
と記載すれば回避されます.

っが面倒くさい.
ならqsub.shの「#PBS -N XXXnameXXX」を「#PBS -N relion_job」として名称を統一するのも宜しいかと.
...何のジョブを走らせているかが不明で困る...
ならrelionのソースを書き換えるかになる.
っで作ってみた
OpenPBS向け改修 †
注意
問題が起こっても責任持ちません.
qsub.shの「XXXnameXXX」には下記のようにRelionによって下記のように書き換わります.
Class2D/job030/
と「/(スラッシュ)」の文字が2つ入ります. ジョブ項目とjob番号の間に1つ. 末尾に1つ.
っでこの始めの「/(スラッシュ)」文字を「.(ドット)」に代えて、末尾の「/(スラッシュ)」文字は削除するようにしてみた
関数を作ればいいのでしょうが、変更箇所を少なくしたいので泥臭い方法でしてます.
| diff --git a/src/pipeline_jobs.cpp b/src/pipeline_jobs.cpp
index 46c54b5..e74a2aa 100644
--- a/src/pipeline_jobs.cpp
+++ b/src/pipeline_jobs.cpp
@@ -550,12 +550,14 @@ bool RelionJob::saveJobSubmissionScript(std::string newfilename, std::string out
fh.seekg(0, std::ios::beg);
std::string line;
std::map<std::string, std::string> replacing;
+ std::string dot = ".";
+ std::string jobname = outputname.replace(outputname.find("/"),1, dot);
replacing["XXXmpinodesXXX"] = floatToString(nmpi);
replacing["XXXthreadsXXX"] = floatToString(nthr);
replacing["XXXcoresXXX"] = floatToString(ncores);
replacing["XXXdedicatedXXX"] = floatToString(ndedi);
replacing["XXXnodesXXX"] = floatToString(nnodes);
- replacing["XXXnameXXX"] = outputname;
+ replacing["XXXnameXXX"] = jobname.substr( 0, jobname.length() - 1);
replacing["XXXerrfileXXX"] = outputname + "run.err";
replacing["XXXoutfileXXX"] = outputname + "run.out";
replacing["XXXqueueXXX"] = joboptions["queuename"].getString();
|
これでジョブ名称[-N]は「Class2D.job038」とかになります.
問題点...ジョブ管理システムで発生した標準出力、標準エラーの取り扱い....
openPBSを直すなら †
Relionはそのままでジョブ管理システムOpenPBSを修正するなら
まずgitでソースコードを拾って、最新版v20.0.1(2021.01時点)に移り
git clone https://github.com/openpbs/openpbs
cd openpbs
git checkout -b v20.0.1 refs/tags/v20.0.1
エラーと指摘される判断部分(src/lib/Libcmds/ck_job_name.c)に手を加える
| diff --git a/src/lib/Libcmds/ck_job_name.c b/src/lib/Libcmds/ck_job_name.c
index decfc3c..fbd54f5 100644
--- a/src/lib/Libcmds/ck_job_name.c
+++ b/src/lib/Libcmds/ck_job_name.c
@@ -60,7 +60,7 @@ isalnumspch(int c)
if (isalnum(c) != 0)
return c;
- if (c == '-' || c == '_' || c == '+' || c == '.')
+ if (c == '-' || c == '_' || c == '+' || c == '.' || c == '/')
return c;
return 0;
|
この修正を含むソースパッケージ(tar.gz)を下記のようにして作って、specファイルもrpmbuildに写します.
cd ..
tar cvfz ~/rpmbuild/SOURCES/openpbs-20.0.1.tar.gz openpbs --transform 's/openpbs/openpbs-20.0.1/' --exclude "openpbs/.git*"
cp openpbs/openpbs.spec ~/rpmbuild/SPEC/
一応ソースを弄ったのでpbs_releaseを「c1」とします.
またpbs_homeもちょいと弄ります.
| --- rpmbuild/SPECS/openpbs.spec.orig 2021-01-03 12:36:41.439212969 +0900
+++ rpmbuild/SPECS/openpbs.spec 2021-01-03 12:39:19.861564518 +0900
@@ -48,7 +48,7 @@
%endif
%if !%{defined pbs_release}
-%define pbs_release 0
+%define pbs_release c1
%endif
%if !%{defined pbs_prefix}
@@ -56,7 +56,7 @@
%endif
%if !%{defined pbs_home}
-%define pbs_home /var/spool/pbs
+%define pbs_home /var/lib/pbs
%endif
%if !%{defined pbs_dbuser}
|
こうして rpmbuild でパッケージを作ります
rpmbuild -ba rpmbuild/SPECS/openpbs.spec
できたパッケージは
ls -l rpmbuild/RPMS/x86_64/openpbs-*c1*
-rw-r--r-- 1 root root 1857224 Jan 3 12:43 rpmbuild/RPMS/x86_64/openpbs-client-20.0.1-c1.x86_64.rpm
-rw-r--r-- 1 root root 8076836 Jan 3 12:43 rpmbuild/RPMS/x86_64/openpbs-debuginfo-20.0.1-c1.x86_64.rpm
-rw-r--r-- 1 root root 428728 Jan 3 12:43 rpmbuild/RPMS/x86_64/openpbs-devel-20.0.1-c1.x86_64.rpm
-rw-r--r-- 1 root root 2256884 Jan 3 12:43 rpmbuild/RPMS/x86_64/openpbs-execution-20.0.1-c1.x86_64.rpm
-rw-r--r-- 1 root root 3418256 Jan 3 12:43 rpmbuild/RPMS/x86_64/openpbs-server-20.0.1-c1.x86_64.rpm
となります。
以降のインストール・設定はOpenPBSを参照してください
これでジョブタイトルに[/(スラッシュ)]が入ってもジョブがそのまま実行されます
留意
qsub.shの内容にも寄りますが、「#PBS -o <標準出力先>」「#PBS -e <標準エラー先>」を明記しないと
タイトル名に「.o<ジョブID>」「.e<ジョブID>」が付いたそれぞれのファイルが用意されます。
末尾が「/(スラッシュ)」で終わっていると標準出力、標準エラーは共に不可視ファイルな「.o<ジョブID>」「.e<ジョブID>」となります。