ユーザーがエミュレーターを×で落としたり、本来閉じておくタイミングで閉じてないなどで異常終了してしまうことが多々あります。
そうなると端末が立ち上がらなくなるので、ユーザーからシステムへ電話がかかってくる。
正直面倒です。お互いに・・・。
そのとき我々システム管理者はACTJOBで確認して、立ち上がっていたらユーザーをENDJOBで落とす。
それでも端末が上がらないときはオンオフをする。
それはWRKDEVDからの「8=状況の処理」で、「2=オフに構成変更」をして、「1=オンに構成変更」をする。
それでダメなら再起動、これで100%元に戻る。
しかしその間数分間が非常に面倒だし、理由が停電だったとしても立ち上がらなくなるのさすがに理不尽。
なので、先日来られたIBMiの先生に何か手は無いものかお聞きしてみた。
結論はダメ。
×で消すのはルール違反なので、IBMは想定していないそうです。
その際はやはりシステム管理者に連絡をさせ、システム管理者が直す必要があるみたい。
そのENDJOBやWRKDEVDをユーザーにやらせるのもダメ。
ユーザーに権限は無いし、それを与えるのもおかしな話だから。
やっぱりダメか。
その件、昔から悩んでいたので一応考えてはいる。
一応ウェブで管理画面を作っているので、そこで使っているSQL文だけ載せておきます。
一覧表を作るためACTJOBの情報を取得する
ACTJOBの情報を取得するSQL文
SELECT * FROM TABLE(QSYS2.ACTIVE_JOB_INFO());
使うカラムはJOB_NAMEだけ。ジョブ番号、ユーザ名、ジョブ名が1カラムになっている。
サブストリングで抜き出せばWHEREだろうとORDERBYでも使えるので実質自由自在。
恐らくどの会社も端末情報をファイル管理しているはずなので、それを主に上記ACTJOBのテーブルをJOINすれば一覧表の出来上がり。
ENDJOBする
LaravelのDBクラスを使っています
DB::statement("CALL QCMDEXC('ENDJOB JOB($NUMBER/$USER/$JNAME) OPTION(*IMMED)')");
$NUMBERはジョブ番号、$USERはユーザ名、$JNAMEはジョブ名。
これを指定すれば即時で落とすことができる。
もちろんtryでエラー処理を加えてできなかった場合の仕組みも考えておいた方が親切。
VRYCFG
WRKDEVDからオンオフというのは、実際にやっているのはVRYCFGという構成変更。
なのでこれもコマンド一発で出来る。
そしてオフるだけでOKみたい。
DB::statement("CALL QCMDEXC('VRYCFG CFGOBJ($NAME) CFGTYPE(*DEV) STATUS(*OFF)')");
$NAMEはジョブ名(装置名)を指定。
スタック情報を取得する
ENDJOBをするといっても大事なプログラムの途中で止まっていたとしたら困る。
実際にはどうにもならないと思けど、一応何をして落ちたのかは確認するようにはしている。
そのためのスタック情報を取得する方法。
SELECT * FROM TABLE(QSYS2.STACK_INFO('ジョブ番号/ユーザ名/ジョブ名'));
これで取得できる。
作った画面
作った画面はこんな感じ。本当はもっとあります。
モザイクの箇所は端末番号、VRYはVRYCFG、ENDはENDJOBのボタン。
ACTJOBに無い端末はVRYCFGだけ、ある端末はVRYCFGとENDJOBを表示。
押せばその処理が実行され、リダイレクトでこの画面に戻ってくる。
そのとき成功なら成功、失敗なら失敗にポップアップを出す。
一応はこれで使えている。
Ajaxを使ってほぼリアルタイムで表示してもいいのだが、負担をかけそうなので止めた。
これをユーザーに開示するのは危険なので、結局システム内で使って楽をする程度にすぎないのかな。
もしユーザーに開示するとしたら、自分の端末しか触れないようにすることと、落としてもいいプログラムなのかを判断することかな。
前者は作ったけど、後者は厳しそう・・・。
以上です。
コメント