質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.46%

  • Windows

    980questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • PowerShell

    217questions

    Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Powershellにてログ書き込みの排他制御をする方法が分からない

解決済

回答 1

投稿 2016/05/31 16:43 ・編集 2016/05/31 18:08

  • 評価
  • クリップ 0
  • VIEW 1,974

hetare_SE

score 8

前提・実現したいこと

powershellにてミドルウェアの制御等を行っております。
ミドルの制御に関してではなく、制御結果などを出力する
ログファイルについて解決したいと思います。

■システム
Windows2012 Server R2 Standard

■PowerShellバージョン
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.3.9600.17400
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

ログの実装方法について(簡易)

「New-Object -ComObject ADODB.Stream」を使用し
「WriteText」や「SaveToFile」を使用しログの書き込みを行っています。

発生している問題・エラーメッセージ

Powershellスクリプトを複数同時に起動して動作させた場合に、ログの書き込みで排他が出来ておらず、エラーまたはログのロストが発生しています。

ファイル書き込み時に発生するエラーは2パターンです。

"1" 個の引数を指定して "LoadFromFile" を呼び出し中に例外が発生しました: "ファイルを開けませんでした。"

"2" 個の引数を指定して "SaveToFile" を呼び出し中に例外が発生しました: "ファイルへ書き込めませんでした。"

該当のソースコード

  try {
    $ado_db_stream = New-Object -ComObject ADODB.Stream
    $ado_db_stream.Charset = $Env:BBB_LANG
    $ado_db_stream.Type = 2
    $ado_db_stream.Open()
    if (Test-Path $LOG_FILE_NAME -PathType Leaf) {
      $ado_db_stream.LoadFromFile($LOG_FILE_NAME)

    }
    $position = $ado_db_stream.Size
    $ado_db_stream.Position = $position
    $ado_db_stream.WriteText("$messagern")
    $ado_db_stream.SaveToFile($LOG_FILE_NAME , 2)
  } catch [Exception] {
    # エラー処理
  } finally {
    $ado_db_stream.Close()
  }

試したこと

ADODB.Streamだと排他制御ができないと考え
log4jを使用してやってみましたが、結果的に排他にはなりませんでした。

解決したい事項

Powershellにて簡単に排他制御(ログ出力)などを行う方法はないでしょうか。
【追記】
プロセスの排他を行うと、処理待ちが発生しますので多重実行された状態でも
ログ出力の排他が行われて欲しいと考えています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

プロセス間の排他制御ならMutexクラスがお手軽です。

コード例

$mutex = New-Object System.Threading.Mutex($false, "ミューテックス名")
$mutex.WaitOne()
# 排他制御したい処理
$mutex.ReleaseMutex()

投稿 2016/05/31 18:04

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/31 18:06

    回答ありがとうございます。

    前提条件の記載が足らず申し訳ありません。
    mutexだとそもそもプロセスの排他になってしまいます。
    当方としては待ちを発生させず、それぞれのプロセスがログを書き込んで欲しいと考えております。

    キャンセル

  • 2016/05/31 18:12

    スクリプト全体ではなく、排他制御が必要な部分だけをWaitOne/ReleaseMutexで挟めば良いと思うのですが、その切り分けができないということでしょうか?

    キャンセル

  • 2016/05/31 18:34

    なるほど、スクリプト全体(単体)としてはmutexを行っていますが、必要な部分だけ制御できるんですね。
    確認してみます。

    キャンセル

  • 2016/06/01 18:22

    教えていただいた排他制御が必要な部分だけを括って実行したところ、意図した排他制御が出来ました!ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.46%

関連した質問

同じタグがついた質問を見る

  • Windows

    980questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • PowerShell

    217questions

    Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。