0

.\output\worker01.logstdout を に、stderr をにリダイレクトしようとしてい.\output\worker01-error.logます。シェルでコマンドを実行すると機能します:

PS Q:\mles\etl-i_test> .\worker\bin\win32\php.exe -q -c .\worker\conf\php.ini .\worker\bin\os-independant\logfilefilter\logfilefilter.php -f .\worker\worker01\conf\logfilefilter-worker01.xml 2> .\output\worker01-error.log > .\output\worker01.log

worker01.logとはworker01-error.log、出力ディレクトリに書き込まれます。

ただし、複数のバックグラウンド プロセスとして、powershell スクリプトで必要です。n 個のワーカー プロセスが存在する可能性があります。私のテストケースには 8 個のワーカーがあります。これは私がそれを呼び出す方法です:

$strPath = get-location
$workers = get-childitem -Path worker -Filter worker*
foreach ($worker in $workers)
{
  Write-Host "Start $worker in background"

  $block = {& $args[0] $args[1] $args[2] $args[3] $args[4] $args[5] $args[6] $args[7] $args[8] $args[9] $args[10]}
  start-job -scriptblock $block -argumentlist `
    "$strPath\worker\bin\win32\php.exe", `
    "-q", `
    "-c", `
    "$strPath\worker\conf\php_win32.ini", `
    "$strPath\worker\bin\os-independant\logfilefilter\logfilefilter.php", `
    "-f", `
    "$strPath\worker\$worker\conf\logfilefilter-$worker.xml", `
    "2>", `
    "$strPath\output\$worker-error.log", `
    ">", `
    "$strPath\output\$worker.log"
}

スクリプトを開始すると、8 つの php プロセスと powershell プロセスが生成され、すぐに消えます。出力ディレクトリにログ ファイルはありません。

4

1 に答える 1

1

引数リストにリダイレクト文字 (">" および "2>") を入れないでください。それらはスクリプトブロックにある必要があります。

  $block = {& $args[0] $args[1] $args[2] $args[3] $args[4] $args[5] $args[6] 2> $args[7] > $args[8]}
  start-job -scriptblock $block -argumentlist `
    "$strPath\worker\bin\win32\php.exe", `
    "-q", `
    "-c", `
    "$strPath\worker\conf\php_win32.ini", `
    "$strPath\worker\bin\os-independant\logfilefilter\logfilefilter.php", `
    "-f", `
    "$strPath\worker\$worker\conf\logfilefilter-$worker.xml", `
    "$strPath\output\$worker-error.log", `
    "$strPath\output\$worker.log"

それはこのように動作します。

于 2013-04-03T13:47:04.257 に答える