Могут ли сценарии * .ps1 работать как фоновые задания, а сами сценарии * .ps1 выполняются? - PullRequest
2 голосов
/ 03 марта 2011

Я хочу запустить 15 экземпляров сценария, который объединяет 5 сценариев вместе, и до сих пор я скучаю по пиковой пыли. Я свел проблему к тестовому сценарию с основным сценарием, который вызывает подчиненный сценарий, который, в свою очередь, вызывает сценарий sub_slave (для воспроизведения ошибки не требуется никаких конвейеров).

Если master.ps1 вызывает slave.ps1, каждое фоновое задание висит на неопределенное время в точке, в которой slave.ps1 вызывает sub_slave.ps1. Если я закомментирую вызов в slave.ps1 для sub_slave.ps1, master.ps1 будет завершен. И если я запускаю slave.ps1 напрямую, он прекрасно выполняет вызов sub_slave.ps1. Проблема кажется неразрешимой, хотя, если я попробую двойную цепь. Я не видел ничего в документах, говорящих, что вы не можете последовательно соединить эти сценарии с какой-то произвольной глубиной, но, возможно, я недостаточно глубоко читаю?

Вы увидите, что я отслеживаю ход выполнения скрипта, добавляя контент в простой текстовый файл.

d: \ работа \ master.ps1

$indexes = @(0,1,2)

$initString = "cd $pwd"
$initCmd = [scriptblock]::create($initString)

set-content -path out.txt -value "Master started"
foreach ($index in $indexes)
{
    add-content -path out.txt -value "job  starting"
    start-job -filepath slave.ps1 -InitializationScript $initCmd -ArgumentList @("master index $index originated")
}

add-content -path out.txt -value "master completed"

d: \ работа \ slave.ps1

#requires -version 2.0

param (
    [parameter(Mandatory=$false)]
    [string]$message = "slave_originated"
)

begin
{
    Set-StrictMode -version Latest
    add-content -path out.txt -value "slave beginning in $pwd"
}

process
{
    add-content -path out.txt -value "slave processing $message"
    invoke-expression "D:\jobs\sub_slave.ps1 -message $message" 
}

end
{
    add-content -path out.txt -value "slave ending"
}

d: \ работа \ sub_slave.ps1 #requires -version 2.0

param (
    [parameter(Mandatory=$false)]
    [string]$message = "sub_slave originated"
)

begin
{
    Set-StrictMode -version Latest

    add-content -path out.txt -value "sub_slave beginning"
}

process
{
    add-content -path out.txt -value "sub_slave processing $message"
}

end
{
    add-content -path out.txt -value "sub_slave ending"
}

Когда код запускается как написано, без каких-либо комментариев, я получаю это в out.txt: d: \ работы \ out.txt

Master started
job  starting
job  starting
job  starting
master completed
slave beginning in D:\jobs
slave processing master index 0 originated
slave beginning in D:\jobs
slave processing master index 1 originated
slave beginning in D:\jobs
slave processing master index 2 originated

Обратите внимание, что следующая следующая команда после каждого прощального сообщения - это вызов sub_slave.ps1 и что сообщение от sub_slave.ps1 вообще не появляется. Система будет зависать с 3 процессами powershell.exe, работающими долго и счастливо. Get-job сообщает, что 3 процесса все еще запущены и HasMoreData.

Единственная подсказка, которая у меня есть, это то, что, если я аварийно завершаю, сбрасываю зависшие процессы, я вижу:

Number of exceptions of this type:        2
Exception MethodTable: 79330e98
Exception object: 012610fc
Exception type: System.Threading.ThreadAbortException
Message: <none>
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131530
-----------------

Number of exceptions of this type:        2
Exception MethodTable: 20868118
Exception object: 01870344
Exception type: System.Management.Automation.ParameterBindingException
Message: System error.
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131501
-----------------

Возможно, у меня какая-то проблема с параметрами? Если я удаляю все параметры из sub_slave.ps1, поведение остается неизменным, поэтому я в этом немного сомневаюсь, но это возможно. Я открыт для любой идеи.

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

Вы называете sub_slave.ps1 неправильно.Это:

invoke-expression "D:\jobs\sub_slave.ps1 -message $message" 

Должно быть так:

D:\jobs\sub_slave.ps1 -message $message

Сообщение получало оценку и становилось несколькими аргументами.

0 голосов
/ 04 марта 2011

Просто сделайте предположение, но наличие нескольких потоков / заданий, записывающих в один файл out.txt, может вызвать проблемы.

...