社内SEの徒然なる日記

powerShellをoperationManagerから実行してみた

ジョブの作成

powerShellをoperationManagerで実行してみます。
Windowsのタスクでも出来るんですけど、せっかくジョブを実行できるソフトがあるので、こちらを使います。

実行するスクリプトはこれ。

D:\script\pingChk.ps1


実際の設定は、こんな感じ。
operetionManagerとpowerShell

環境によっては、コマンドの「v1.0」の部分が変わるんでしょうかね。
Ver.上げる気が無いので、確認できませんけどね。

他のタグの設定は、初期値のままにします。

スクリプト

「pingChk.ps1」の内容です。
ロジック部分は長いので省略してます。やってることはpingとかなんで、別の記事(下段リンク「目次」)からご覧ください。

# フォルダ構成を定義
[System.String]$RootDIR = 'D:\script'
[System.String]$LogDIR = $RootDIR + '\log' # ログ

# 処理開始時点での日時情報
[System.String]$OpeDate = Get-Date -format yyyyMMdd_HHmmss

# ログファイル定義
[System.String]$LogName = $LogDIR + '\' + $OpeDate + '.log'
[boolean]$LogDateTrue = 1 # ログ出力関数用 「日時を追加する」
[boolean]$LogDateFalse = 0 # ログ出力関数用 「日時を追加しない」

# ----------------------
# ログ出力用関数
# ----------------------
# 【機能概要】
# メッセージを、画面とテキストファイルに追加書込みします。
# 出力時に日時を追加表示することも可能です。
# 【引数】
# msg 表示するメッセージ
# file 出力するテキストファイルの完全パス
# dspTimeFlag メッセージへの日時に追加出力(0:追加しない, 1:追加する)

function msgOutput([String]$msg, [String]$file, [boolean]$dspTimeFlag) {
if ($dspTimeFlag) {
$WkLogTimeMsg = Get-Date -format yyyy/MM/dd-HH:mm:ss
Write-Host ($msg + ' : ' + $WkLogTimeMsg)
Write-Output ($msg + ' : ' + $WkLogTimeMsg) | out-file $file Default -append
} else {
Write-Host $msg
Write-Output $msg | out-file $file Default -append
}
}

# ----------------------
# エラートラップ関数
# ----------------------
# 【機能概要】
# 各スクリプトのtrapで実行するエラー共通処理です。
# ログと画面にエラー内容を出力します。

function errorTrap() {
msgOutput '' $LogName 0
msgOutput '□□□□□□□□□□□□□□□□□□□□□□' $LogName $LogDateFalse
msgOutput '□' $LogName $LogDateFalse
msgOutput '□ 異常終了しました。' $LogName $LogDateFalse
msgOutput '□' $LogName $LogDateFalse
$Error[0] # ログ関数に渡すと、エラー発生個所とかが消えるので直接ログに
Write-Output $Error[0] | out-file $LogName Default -Append # 書込みを行います。画面にも表示したいので2行になります。
msgOutput '□' $LogName $LogDateFalse
msgOutput '□□□□□□□□□□□□□□□□□□□□□□' $LogName $LogDateFalse
}

# エラートラップを準備します。
trap {
errorTrap
exit 99
}

# 処理開始
msgOutput '□□□□□□□□□□□□□□□□□□□' $LogName $LogDateFalse
msgOutput '死活監視を開始します。' $LogName $LogDateTrue
msgOutput '□□□□□□□□□□□□□□□□□□□' $LogName $LogDateFalse
msgOutput '' $LogName $LogDateFalse

*** ロジック ***

# 正常終了
msgOutput '□□□□□□□□□□□□□□□□□□□' $LogName $LogDateFalse
msgOutput '死活監視を終了しました。' $LogName $LogDateTrue
msgOutput '□□□□□□□□□□□□□□□□□□□' $LogName $LogDateFalse
exit 0


スクリプトのエラーコードはexitの後に数値を入れることで設定できるようです。
なので、処理の先頭でエラートラップを仕込んで、異常時にはエラーコード「99」が返却されるようにします。
処理が最後まで実行された場合には「0」が返却されるようにします。

テスト

スクリプト自体は、事前に手動で動作を確認しておきます。
んで、さっそくoperationManagerから起動してみると見事に異常終了しました。

Windowsサーバーが64bit版で、operationManagerが32bit版である関係で、実行時ポリシーの設定を32bit用のpowerShellに対して設定しないといけなかったようです。

  詳細はこちらを参照 http://harikofu.blog.fc2.com/blog-entry-36.html

ポリシーを設定して再度実行すると、またまたエラーが出る。
なんだろ?

実験しましょう

発生条件を掴むために、いろいろと実験してみました。

test.ps1



# エラートラップの設定
# 全てのエラーを捉えたいので、ErrorActionPreferenceにstopを設定

$ErrorActionPreference = "Stop" # Stop(停止), Inquire ( 問い合わせ ), Continue ( 続行 )

Write-Host ('テスト開始')

& 'D:\script\testBat.bat'

Write-Host ('テスト終了')

# -----------------------------
# 正常終了
# -----------------------------

Write-Host ('正常終了')
exit 0

# ----------------------
# エラートラップ
# ----------------------

trap {
Write-Host ('異常終了')
$Error[0]
exit 99
}


testBat.bat



exit


単純に、powerShellからバッチを実行するだけの処理です。
実際に、これを実行した結果が下記のログです。

テスト開始
D:\script>exit
異常終了
Write-Host : OS ハンドルの位置が FileStream が予期していた位置ではありませんで
した。FileStream 内と Win32 コード内または別の FileStream 内で 1 つのハンドルを
同時に使用しないでください。データが失われる可能性があります。
発生場所 D:\script\test.ps1:10 文字:11
+ Write-Host <<<< ('テスト終了')
+ CategoryInfo : NotSpecified: (:) [Write-Host]、IOException
+ FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Comma
nds.WriteHostCommand


ふむ、どうやらpowerShellから別のジョブを実行するとエラーになるようです。
バッチファイルの他に、Oracleのエクスポートなども試して見ましたが、同じように異常終了します。
ちなみに、powerShellからpowerShellの実行は問題なく動作しました。

サポートセンターに聞いてみた

正直、お手上げです。
なので、サポートセンターに上記のスクリプトを送って原因を教えてもらうことにしました。

実行ポリシーの部分でも書きましたけど、サーバが64bit版でoperationManagerが32bit版の時に、こういう現象が発生するらしいです。
operationManagerが32bit版の場合、powerShellは32bit版で実行され、その結果、ジョブが正しく動作しないらしいです。
はっきりとは言ってませんでしたが、operationManagerは悪くなくて、Microsoft側の問題という感じの回答に聞こえました。

...なんか、納得し難いですね。
32bit用のpowerShellで手動実行しても正常終了するわけだし、operationManager側で対応できないものなんだろうか?
うーん、JP1だとどうなんだろうなぁ?

スケジュール登録

まぁ、特定条件下で動かないってのは、よくある話なので回避策をとる事にします。
やりようは、いくらでもありますしね。
今回は、外部バッチを実行していた部分をoperationManagerから直接実行させることにしました。

後は、実行スケジュールは、毎朝実行するように設定して完了です。

富士通SupportDesk

サポートセンターって書いてますけど、実際は「富士通SupportDesk」ですね。
数回使った感想としては、結構頼りになると感じてます。

今回は「もう少しなんとかならんか?」と思う回答ではありましたが、operationManagerって製品自体に回避策が無い以上、サポートデスクとしては、これ以上の回答は出来ないでしょうしね。


投稿記事の一覧:目次
スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する