UbuntuでのOpenPBSの設定

Ubuntuの自前クラスター計算機のジョブスケジューラーを入れるための覚書。
[CentOS7でのOpenPBSの設定 #centos7 - Qiita](https://qiita.com/Yasushi-Shinohara/items/155ac8bc84b310b7c691)ではCentOSを前提にまとめた。CentOSからALMALinuxやUbuntuにディストリビューションが移ってきているので、Ubuntu版もまとめることにした。

```:計算機群の構成の想定
hoge000: PBSサーバー、NFSサーバー(/home, /opt_share)、NISサーバー
hoge001: PBSクライアント、NFSクライアント(/home, /opt_share)、NISクライアント
hoge002: PBSクライアント、NFSクライアント(/home, /opt_share)、NISクライアント
...
```

# OpenPBSのサーバーのインストール
## Ubuntu22.04の場合
`cat /etc/lsb-relase`で
```console:出力
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"
```
の計算機にインストール。

### ソースダウンロード
https://github.com/openpbs/openpbs/releases
v23.06.06.tar.gzが2024/05/01時点での最新版。ここでは、ダウンロードしたファイルが”v23.06.06.tar.gz”として話を進める。

### 準備
以下の内容を実行(ソースコードを展開したディレクトリにある`INSTALL`ファイルにあるUbuntu-18.04向けの記載から。なんか知らんけど、v20.0.0と思しき記載が多い...):

```bash:1. Install the prerequisite packages for building PBS.
    sudo apt install gcc make libtool libhwloc-dev libx11-dev \
      libxt-dev libedit-dev libical-dev ncurses-dev perl \
      postgresql-server-dev-all postgresql-contrib python3-dev tcl-dev tk-dev swig \
      libexpat-dev libssl-dev libxext-dev libxft-dev autoconf \
      automake g++
```

```bash:2. Install the prerequisite packages for running PBS.
    sudo apt install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin \
      sudo tcl tk libical3 postgresql-server-dev-all
```

### インストール用ディレクトリの作成
`sudo mkdir /opt/openpbs-23.06.06`を実行。

### ソースの展開
```bash
sudo tar -zxvf v23.06.06.tar.gz
cd ./openpbs-23.06.06
```

### configure, make, make install
```bash
sudo ./autogen.sh
sudo ./configure --prefix=/opt/openpbs-23.06.06
sudo make
sudo make install
```

### ポストインストールプロセス

`sudo /opt/openpbs-23.06.06/libexec/pbs_postinstall`を実行。

### サーバー用`/etc/pbs.conf`の編集

PBSサーバーが計算機サーバーも兼ねる構成にするために、“PBS_START_MOM=0”の個所を”PBS_START_MOM=1”に変更。例えば、サーバーでの設定は以下のような感じ。

```:/etc/pbs.conf
PBS_SERVER=hoge000
PBS_START_SERVER=1
PBS_START_SCHED=1
PBS_START_COMM=1
PBS_START_MOM=1 #PBSサーバーも計算を実行する仕様
PBS_EXEC=/opt/openpbs-23.06.06
PBS_HOME=/var/spool/pbs
PBS_CORE_LIMIT=unlimited
PBS_SCP=/usr/bin/scp
```

### パーミションの変更

```bash
sudo chmod 4755 /opt/openpbs-23.06.06/sbin/pbs_iff /opt/openpbs-23.06.06/sbin/pbs_rcp
```

### デーモンの起動

`sudo /etc/init.d/pbs start`の実行

<details><summary>出力</summary>

```console:出力
Starting PBS
PBS Home directory /var/spool/pbs needs updating.
Running /opt/openpbs-23.06.06/libexec/pbs_habitat to update it.
***
*** Setting default queue and resource limits.
***
Communication failure.
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qterm: could not connect to server  (15010)
cp: cannot stat '/usr/pgsql-14.11/lib/*': No such file or directory
cp: cannot stat '/usr/pgsql-14.11/lib/*': No such file or directory
cp: cannot stat '/usr/pgsql-14.11/share/timezonesets/*': No such file or directory
cp: cannot stat '/usr/pgsql-14.11/share/timezonesets/*': No such file or directory
cp: cannot stat '/usr/lib/postgresql/14/bin/pg_resetxlog': No such file or directory
*** End of /opt/openpbs-23.06.06/libexec/pbs_habitat
Home directory /var/spool/pbs updated.
/opt/openpbs-23.06.06/sbin/pbs_comm ready (pid=255126), Proxy Name:hoge000:17001, Threads:4
PBS comm
PBS mom
PBS sched
Connecting to PBS dataservice...connected to PBS dataservice@hoge000
PBS server
```
</details>

この時点で多分何かうまくいっていない。
[OpenPBSクラスターを構築する【Ubuntu22.04編】 #Ubuntu22.04 - Qiita](https://qiita.com/amasaki203/items/3aff46d570a49d1b216d)の[トラブルシューティング](https://qiita.com/amasaki203/items/3aff46d570a49d1b216d#%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)に従って、いろいろ設定を変えてみたが特にうまくいかない。

その後、<font color="red">試しに再起動したら、普通に起動した。</font>(順番が前後するが、以降の`qstat`, `pbsnodes -a`, ` qmgr -c 'p s'`全て期待通りの挙動。)**再起動はすべてを解決する**。

### PATH等の環境設定

`source /etc/profile.d/pbs.sh`を実行。ルートだけでなく、一般ユーザーでも実行。(再度ログインして新しいセッションを立ち上げれば勝手に実行されているくさい)

### 正しく導入されているのかの確認

`qmgr -c 'p s'`の出力

```console
#
# Create queues and set their attributes.
#
#
# Create and define queue workq
#
create queue workq
set queue workq queue_type = Execution
set queue workq enabled = True
set queue workq started = True
#
# Set server attributes.
#
set server scheduling = True
set server default_queue = workq
set server log_events = 511
set server mailer = /usr/sbin/sendmail
set server mail_from = adm
set server query_other_jobs = True
set server resources_default.ncpus = 1
set server default_chunk.ncpus = 1
set server scheduler_iteration = 600
set server resv_enable = True
set server node_fail_requeue = 310
set server max_array_size = 10000
set server pbs_license_min = 0
```

qstat -Bの出力

```console
erver             Max   Tot   Que   Run   Hld   Wat   Trn   Ext Status
---------------- ----- ----- ----- ----- ----- ----- ----- ----- -----------
hoge000              0     0     0     0     0     0     0     0 Active
```


pbsnodes -aの出力

```console
hoge000
     Mom = hoge000
     ntype = PBS
     state = free
     pcpus = 8
     resources_available.arch = linux
     resources_available.host = hoge000
     resources_available.mem = 32728888kb
     resources_available.ncpus = 8
     resources_available.vnode = hoge000
     resources_assigned.accelerator_memory = 0kb
     resources_assigned.hbmem = 0kb
     resources_assigned.mem = 0kb
     resources_assigned.naccelerators = 0
     resources_assigned.ncpus = 0
     resources_assigned.vmem = 0kb
     resv_enable = True
     sharing = default_shared
     license = l
     last_state_change_time = Wed May  1 17:37:18 2024
```
### 終了したジョブの履歴を表示
すでに終了したジョブの履歴を`qstat -x`、`qstat -H`で確認したいので、`job_history_enable = True`, `job_history_duration = 720:00:00`(720時間=30日間)を設定する。
`pbs.sh`のスクリプトが`sudo`時のPATHに反映されていないので、`sudo`するときは`qmgr`はfull pathで直打ち:
```bash
sudo /opt/openpbs-23.06.06/bin/qmgr -c "set server job_history_enable = True"
sudo /opt/openpbs-23.06.06/bin/qmgr -c "set server job_history_duration = 720:00:00"
```


# OpenPBSのクライアントのインストール
## Ubuntu22.04の場合
`cat /etc/lsb-relase`で
```console:出力
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"
```
の計算機にインストール。

インストールの手続きはサーバー用と基本的には同じで、唯一の例外は`/etc/pbs.conf`の書き方だけ。

### サーバー用`/etc/pbs.conf`の編集

PBSクライアント“PBS_START_MOM”, "PBS_START_SCHED", "PBS_START_COMM"をいずれも0に。が計算機サーバーなので”PBS_START_MOM=1”に変更。例えば、サーバーでの設定は以下のような感じ。

```:/etc/pbs.conf
PBS_SERVER=hoge000
PBS_START_SERVER=0
PBS_START_SCHED=0
PBS_START_COMM=0
PBS_START_MOM=1
PBS_EXEC=/opt/openpbs/default
PBS_HOME=/var/spool/pbs
PBS_CORE_LIMIT=unlimited
PBS_SCP=/usr/bin/scp
```

残すはサーバーでも行った、パーミションの変更と、デーモンの起動。

一度、ログアウトして再度ログインすれば、PATH等は通っている。

### PBSクライアントをPBSサービスに追加

以上の作業だけでは、追加したPBSクライアント`hoge001`はPBSサーバー`hoge000`上のサービスに認識されていない。これを行うために

```console
sudo /opt/openpbs-23.06.06/bin/qmgr -c "create node hoge001"
```
を実行(sudoにqmgrのPATHを通していないのでfull pathで直打ち。

ここまでうまく行っていれば、`pbsnodes -a`の実行で

```console
hoge000
     Mom = hoge000
     ntype = PBS
     state = free
     pcpus = 32
     resources_available.arch = linux
     resources_available.host = hoge000
     resources_available.mem = 263728756kb
     resources_available.ncpus = 32
     resources_available.vnode = hoge000
     resources_assigned.accelerator_memory = 0kb
     resources_assigned.hbmem = 0kb
     resources_assigned.mem = 0kb
     resources_assigned.naccelerators = 0
     resources_assigned.ncpus = 0
     resources_assigned.vmem = 0kb
     resv_enable = True
     sharing = default_shared
     license = l
     last_state_change_time = Wed Oct  2 18:29:58 2024
     last_used_time = Fri Sep 20 19:14:35 2024

hoge001
     Mom = hoge001
     ntype = PBS
     state = free
     pcpus = 192
     resources_available.arch = linux
     resources_available.host = hoge001
     resources_available.mem = 792287728kb
     resources_available.ncpus = 192
     resources_available.vnode = hoge001
     resources_assigned.accelerator_memory = 0kb
     resources_assigned.hbmem = 0kb
     resources_assigned.mem = 0kb
     resources_assigned.naccelerators = 0
     resources_assigned.ncpus = 0
     resources_assigned.vmem = 0kb
     resv_enable = True
     sharing = default_shared
     license = l
     last_state_change_time = Wed Oct  2 18:29:58 2024
     last_used_time = Fri Sep 13 17:57:21 2024
```
といった、出力が得られる。

# トラブルシューティング
## `Permission denied`
OpenPBS経由で走らせた、自家製openmpiでのみ以下のメッセージで止まる。(`apt-get`でインストールしたmpirunでは問題ない。また、bashにコマンドを書いて実行した場合も、自家製か`apt-get`製かに依らず、問題ない)

```console:エラー出力
Permission denied, please try again.
Permission denied, please try again.
shinohara@hoge000: Permission denied (publickey,password).
--------------------------------------------------------------------------
PRTE has lost communication with a remote daemon.

  HNP daemon   : [prterun-hoge000-361694@0,0] on node HOGE000
  Remote daemon: [prterun-HOGE000-361694@0,1] on node hoge000

This is usually due to either a failure of the TCP network
connection to the node, or possibly an internal failure of
the daemon itself. We cannot recover from this failure, and
therefore will terminate the job.
--------------------------------------------------------------------------
```

パスフレーズなしのカギを設定して実行したところ、この問題は解決。

## slot数が正しく設定されていない
`mpirun -oversubscribe -np N`で、Nを2以上にすると以下のエラー出力で止まる。
一つ前のトラブルと同じで、OpenPBS経由で走らせた、自家製openmpiでのみ以下のメッセージで止まる。(`apt-get`でインストールしたmpirunでは問題ない。また、bashにコマンドを書いて実行した場合も、自家製か`apt-get`製かに依らず、問題ない)


```console:エラー出力
--------------------------------------------------------------------------
There are not enough slots available in the system to satisfy the 4
slots that were requested by the application:

  ../src/mATTOHF

Either request fewer procs for your application, or make more slots
available for use.

A "slot" is the PRRTE term for an allocatable unit where we can
launch a process.  The number of slots available are defined by the
environment in which PRRTE processes are run:

  1. Hostfile, via "slots=N" clauses (N defaults to number of
     processor cores if not provided)
  2. The --host command line parameter, via a ":N" suffix on the
     hostname (N defaults to 1 if not provided)
  3. Resource manager (e.g., SLURM, PBS/Torque, LSF, etc.)
  4. If none of a hostfile, the --host command line parameter, or an
     RM is present, PRRTE defaults to the number of processor cores

In all the above cases, if you want PRRTE to default to the number
of hardware threads instead of the number of processor cores, use the
--use-hwthread-cpus option.

Alternatively, you can use the --map-by :OVERSUBSCRIBE option to ignore the
number of available slots when deciding the number of processes to
launch.
--------------------------------------------------------------------------
```

原因はPBSのジョブサブミットスクリプトの文法が誤っており、適切に`PBS_NODEFILE`が生成されていなかったため。
```bash:正しいcalc.sh
#!/bin/bash                                                                     
#PBS -l select=host=hoge000:ncpus=4:mpiprocs=4

cd $PBS_O_WORKDIR

cat $PBS_NODEFILE

module purge
module load openmpi/5.0.3/gcc-11.4.0
module list &> ${LOG}

EXE=../src/mATTOHF
IN='"./input.dat"'
mpirun  -np 4  ${EXE} <<< ${IN} >> ${LOG}
```
この`cat $PBS_NODEFILE`には以下のような内容が書き込まれていた(ジョブの終了後このファイルは消える)
```console:/var/spool/pbs/aux/${PBS_JOBID}
hoge000
hoge000
hoge000
hoge000
```

誤っていた原因は、<font color="red">設定の箇所の`mpiprocs`を指定していなかった</font>ため。(つまりインストール等の不備はなくて、単に利用時の実行スクリプトが誤っていたというだけ)CentOS7での実行時は、`ncpu`の設定だけでどうにかなっていた(OSのバージョンに加えて、PBSのバージョンの違いも理由?)ので、これまでは考えてこなかった。
[以下の経緯](https://qiita.com/Yasushi-Shinohara/items/fd33e354bb2ad58009bf#%E8%A7%A3%E6%B1%BA%E7%AD%96%E3%81%AB%E8%87%B3%E3%82%8B%E7%B4%86%E4%BD%99%E6%9B%B2%E6%8A%98)でそもそも`PBS_NODEFILE`ってどんなものが書き込まれているのか調べるために検索したところ、[OpenPBS/PBS_NODEFILE - Chaperone](https://web.chaperone.jp/w/index.php?OpenPBS/PBS_NODEFILE)で、どうも`mpiprocs`の指定が必要だぞ と書かれていたので、記載したところうまくいった。

これが誤った版のスクリプト
```bash:誤ったcalc.sh
#!/bin/bash                                                                     
#PBS -l select=host=hoge000:ncpus=4

cd $PBS_O_WORKDIR

cat $PBS_NODEFILE

module purge
module load openmpi/5.0.3/gcc-11.4.0
module list &> ${LOG}

EXE=../src/mATTOHF
IN='"./input.dat"'
mpirun  -np 4  ${EXE} <<< ${IN} >> ${LOG}
```


### その場しのぎの解決法

結果的に動いたのは、`-oversubscribe`を使って
```bash:calc.sh(抜粋)
mpirun -oversubscribe -np 4 ./a.out
```
としたもの。この方法だと、乗っているコア数がいくらだろうが、なんでも指定できてしまう(10年以上前のmpiのライブラリはどれもそうだった気がするが)のでちょっと気持ち悪いが、ひとまずこれで運用する。

### ダメだった取り組み
hostfileを作って`--hostfile`オプションで読み込んでみたけれど色々文句を言われて、うまく動かなかった。

OpenPBSとOpenMPIの連携が適当だからなのかもしれない(以前古いバージョンをCentOSに入れたときは問題なかったが)と思い、`./configure`に`--with-tm=/opt/openpbs-23.06.06`のオプションをつけてみたが、問題は特に解決しなかった。

bashでは動いてOpenPBS経由だと動かないので、何かの設定が読み込まれていないのだと思うのだけれど、OpenMPIの環境変数を調べたり、bashとOpenPBSで`env`の出力を書き出して比較したりしたけれど、原因はよくわからない(総当たりで調べるのは大変なので諦めた ということ)

ChatGPT 3.5に聞いたみたけれど、一般的には妥当そうな回答をしてくれるが、私の環境を考慮してくれているわけではないので、原因を探すヒントにはほとんどならなかった

PBSのスクリプトに`env > ./env.log`を記載して環境変数を書き出すと、`LIBRARY_PATH`, `LD_RUN_PATH`, `LD_LIBRARY_PATH`が書き込まれていない。`module load`で設定しているはずだけれど、`prepend`で追加しているので、そもそもない環境変数には足されないのかもしれない。PBSでそもそもどの環境変数を導入するかは`/var/spool/pbs/environment`に記載があるよう。
しかし、これらのPATHを入れても、エラーメッセージは変わらなかった。

### 解決策に至る紆余曲折
`apt install`で入れたOpenMPIは期待通りの挙動で動いている。なので、この版のビルド状態を模擬すればうまくいく可能性が高い気がする。これは`ompi_info | grep "Configure command line"`で実行できて、私の環境だと
```console:出力(自家製)
  Configure command line: '--prefix=/opt/openmpi/5.0.3/gcc-11.4.0' '--with-tm=/opt/openpbs-23.06.06'
```
```console:出力(apt install)
  Configure command line: '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--disable-option-checking' '--disable-silent-rules' '--libdir=${prefix}/lib/x86_64-linux-gnu' '--runstatedir=/run' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-silent-rules' '--disable-wrapper-runpath' '--with-package-string=Debian OpenMPI' '--with-verbs' '--with-libfabric' '--with-psm' '--with-psm2' '--with-ucx' '--with-pmix=/usr/lib/x86_64-linux-gnu/pmix2' '--with-jdk-dir=/usr/lib/jvm/default-java' '--enable-mpi-java' '--enable-opal-btl-usnic-unit-tests' '--with-libevent=external' '--with-hwloc=external' '--disable-silent-rules' '--enable-mpi-cxx' '--enable-ipv6' '--with-devel-headers' '--with-slurm' '--with-sge' '--without-tm' '--sysconfdir=/etc/openmpi' '--libdir=${prefix}/lib/x86_64-linux-gnu/openmpi/lib' '--includedir=${prefix}/lib/x86_64-linux-gnu/openmpi/include'
```
くらい差がある。

参考URL: [OpenPBSクラスターを構築する【Ubuntu22.04編】 #Ubuntu22.04 - Qiita](https://qiita.com/amasaki203/items/3aff46d570a49d1b216d)

この両者を眺めていると、`'--with-pmix=/usr/lib/x86_64-linux-gnu/pmix2'`のあたりが怪しそう。(まだ試していない) 
[Process Management Interface (PMI) とは &#183; Keichi Takahashi](https://keichi.dev/post/pmi/)
一方で、OpenMPIビルド時にサードパーティのPMIxはインストールされている(`pmix_info`でバージョンが確認できる)ので、PMIxが入っていないわけではなさそう。

その後色々確認したところ、そもそもPBS側で指定されていた情報(この時点ではNCPUの指定だけで十分だと思っていた)がapt版OpenMPIでも自家製版OpenMPIでもこちらが指定された数字は伝わっていなことがわかった。
具体的には`mpirun echo $HOSTNAME`を実行すると、設定されたプロセス数だけHostnameを出力するのだけれど、apt版OpenMPIはどんなNCPUでも4回、自家製OpenMPIではどんなNCPUでも一回しか出力しなかったため。
[公式情報](https://docs.open-mpi.org/en/v5.0.x/launching-apps/tm.html)によると、基本的にPBSから呼び出した場合は、hostfileの情報はPBSが監督するので設定する必要がない というような記述が見当たるので、何か連携に不備がるのではないか と考えだした。

この辺からPBSの情報がMPIに渡すところに不備があるのかな と思って、ChatGPT3.5に以下のプロンプトで尋ねた。
```console:You
OpenPBSで設定した情報が、ビルドしたOpenMPIに適切に読み込まれていないようです。どのような原因が考えられますか？
```
```console:ChatGPT
OpenPBSとOpenMPIを組み合わせて使用する際に、設定情報が適切に読み込まれない可能性があるいくつかの原因が考えられます。以下はその例です：

環境変数の設定不足: OpenPBSで設定した情報が、環境変数として適切に設定されていない場合があります。たとえば、PBS_NODEFILEやPBS_NUM_NODESなどの環境変数がOpenMPIに正しく渡されているか確認してください。

OpenMPIの設定: OpenMPIがPBSProと連携するための設定が不足している可能性があります。OpenMPIの設定ファイル（通常は$HOME/.openmpi/mca-params.confなど）を確認し、PBSProとの連携に必要な設定が行われているか確認してください。

ノード間通信の問題: ノード間通信に関連する設定が適切に行われていない場合、MPIプロセス間の通信に問題が発生する可能性があります。ネットワークの設定やファイアウォールなどを確認し、通信がブロックされていないかどうかを確認してください。

OpenPBSのバージョン: 使用しているOpenPBSのバージョンによっては、OpenMPIとの連携に問題がある場合があります。最新バージョンのOpenPBSやOpenMPIを使用してみてください。

これらの原因を確認して、問題を特定し解決することができるでしょう。
```
このあたりで、`$PBS_NODEFILE`の中身をジョブ中に`cat`で表示したところ空であることがわかった。
```console:You
OpenPBSでPBS_NODEFILEが適切に作られていないようです。どのような問題が考えられますか。
```
```console:ChatGPT
PBS_NODEFILEが適切に作成されない場合、以下のような問題が考えられます。

PBSProの設定不備: PBSProがノードファイルを適切に生成するための設定が不足している可能性があります。PBSProの設定ファイル（通常は/etc/pbs.confや/etc/pbs.conf.d/内のファイル）を確認し、ノードファイルの生成に関連する設定が正しく行われているか確認してください。

ノードリソースの登録: PBSProがノードリソースを適切に認識していない場合、ノードファイルが正しく生成されないことがあります。PBSProの管理下にあるノードが正しく登録されているか、pbsnodes -aコマンドなどで確認してください。

PBSノードマネージャの状態: PBSノードマネージャが正常に動作していない場合、ノードファイルが生成されないことがあります。PBSノードマネージャのログを確認し、エラーや警告メッセージがあるかどうかを確認してください。

ネットワーク通信の問題: ノードファイルの生成には、PBSProサーバーと各ノードの間での通信が必要です。ネットワークの問題やファイアウォール設定などが原因で通信が阻害されている可能性があります。ネットワーク設定を確認し、通信が遮断されていないかどうかを確認してください。

これらの要因をチェックして、PBS_NODEFILEが正しく生成されるように問題を特定して修正していくことが重要です。
```
それで、どうも`PBS_NODEFILE`の生成あたりが怪しいのでは となって問題解決に至る。

## `qsub: Bad UID for job execution` その1

インストール後、一度は動いていたのにNISやらNFS、付随して`/etc/hosts`の設定を変えて、PBSのクライアントを足したのちに、`echo "sleep 60; hostname; echo done" | qsub -l select=host=hoge000`を実行したら、`qsub: Bad UID for job execution`なるエラーメッセージをいただいた。

```bash:
sudo service network-manager restart
sudo /etc/init.d/pbs restart
```
でネットワークとPBSを再起動したところ、再びジョブを投入できるようになった。

## クライアント側のstatusがEでジョブが正常終了しない

[Jobs not getting Run. Goes to E state and stops - Users/Site Administrators - OpenPBS](https://community.openpbs.org/t/jobs-not-getting-run-goes-to-e-state-and-stops/3140)
を見ると、`$usecp`を使えとあるので、調べると
[IoTeX: PBS pro (openpbs) のインストールと設定](https://www.gfd-dennou.org/arch/iotex/center2/05_ComputationNode-PBSpro-setup.htm.ja)
[ジョブスケジューラPBSProでGPU計算クラスタを組みAIを効率的に学習させる方法 (前編) #Docker - Qiita](https://qiita.com/MasafumiTsuyuki/items/acf4b19b54937496e32b)
という内容が見つかる。
これに則って、

```:/var/spool/pbs/mom_priv/config
$clienthost hoge000
$restrict_user_maxsysid 999
$usecp *:/home/ /home/
```
として、`sudo /etc/init.d/pbs restart`をサーバーとクライアントで両方行ったところ解決した。

## `qsub: Bad UID for job execution` その2

PBSクライアントで`echo "sleep 60; hostname; echo done" | qsub -l select=host=hoge000`を実行すると`qsub: Bad UID for job execution`をいただく。

計算機自体の再起動を行うも、問題は解決せず。(`pbsnodes -a`では正しく計算機の状況が表示されている)

解決策は多分、以下
```
Qmgr: set server flatuid = True
```
# OpenPBS公式情報

## Reference Guide

[PBS Professional 2021.1 Reference Guide - Documentation](https://2021.help.altair.com/2021.1/PBSProfessional/PBSReferenceGuide2021.1.pdf)

### 2.33.2.2 Maintenance Reservations
> PBS sets the reservation's resv_nodes attribute value so that all CPUs on the reserved hosts are assigned to themaintenance reservation. The select specification is always the following:
```
-lselect=host=<host1>:ncpus=<number of CPUs at host1>+host=<host2>:ncpus=<number of CPUs at
host2>+...
```
### 2.59.7 Environment Variables

`PBS_NODEFILE`: Name of file containing the list of vnodes assigned to the job. Created when `qsub` is run

### 5.5 Resource Table Format
`mpiprocs`: Number of MPI processes for this chunk. Cannot use sum fromchunks as job-wide limit. The number of lines in `PBS_NODEFILE` is the sum of the values of `mpiprocs` for all chunks requested by the job. For each chunk with `mpiprocs=P`, the host name for that chunk is written to the `PBS_NODEFILE` *P* times.
`ncpus`: Number of processors.

## User's Guide

[PBS Professional 2022.1 User's Guide - Documentation](https://2022.help.altair.com/2022.1.0/PBS%20Professional/Japanese/PBSUserGuide2022.1.pdf)

### 4.8.3.2 ノ ー ド 指定の変換
```
-lselect=N:ncpus=P:mpiprocs=P
-lselect=4:ncpus=2:mpiprocs=2 # 4ノード、2 MPI processes per node
```