2013-10-10 4 views
0

У меня есть проблема понимания с использованием фонового процесса.Фоновые задания досрочно

Мне нужно преобразовать логику обработки, которая находится на Linux в сторону Windows. У меня есть сценарий, который в своем лечении, среди других, еще один сценарий в фоновом режиме, и продолжает его лечение. Скрипт, который запускает (запускает) фоновый режим лечения, не должен заботиться о результате этого, таким образом, должен заканчиваться, даже если обработка в backgroud все еще выполняется.

Что я экспериментировал в Powershell, когда заканчивается мой первый скрипт, похоже, что обработка скрипта, брошенного на задний план, прерывается.

Вот пример из тестов, которые я сделал в моей среде (PowerShell версии 2.0)

Вот простой код моего первого сценария script_1.ps1:

start-job -filepath d:\script\script_2.ps1 
sleep 3 
get-item d:\log\log 

И мой второй сценарий script_2.ps1:

sleep 1 
"test" > d:\log\log-1.log 
sleep 1 
"test" > d:\log\log-2.log 
sleep 1 
"test" > d:\log\log-3.log 
sleep 1 
"test" > d:\log\log-4.log 
sleep 1 
"test" > d:\log\log-5.log 

Вот что происходит, когда я представить его:

C:\Documents and Settings\user1>Powershell -command "D:\script\script_1.ps1" 

Id Name State HasMoreData Location Command  
-- ---- ----- ----------- -------- ------- 
1 Job1 Running True   localhost sleep 1... 

LastWriteTime : 2013-10-10 10:19:13 
Length  : 14 
Name   : log-1.log 


LastWriteTime : 2013-10-10 10:19:14 
Length  : 14 
Name   : log-2.log 

Результат показывает, что, когда первый скрипт завершается, (через 3 секунды), второй скрипт останавливается также, потому что мы видим, что были созданы только первые 2 файла журналов.

Я старался, чтобы это было на Linux (&), где фоновая работа продолжается в любом случае. Разве это так, как полагают, с PowerShell или что-то, что я делаю неправильно?

ответ

0

В Linux, фоновая работа будет продолжать работать, только если запущены с помощью команды поЬира или параметр nohuponexit устанавливаются в оболочке (или процесс позже отрекся с командой эпонима)

Советов о том, как сделать то же самое с PS можно в this thread of emails на фрилансере.

3

Когда вы используете переключатель -Command для запуска PowerShell, он запускает прилагаемую команду, а затем выходит из сеанса. Работы в PowerShell специфичны для сеанса . Они запускаются. Вы можете это увидеть сами, если хотите, запустив два экземпляра (сеансов) PowerShell. Создайте задание в одном, например. start-Job {sleep 600}, и выполните get-Job, вы увидите, что задание Running. Если вы наберете get-Job в других экземпляра PowerShell, вы увидите, что вакансий нет.

Командлет start-Job создает задание, но он не дожидается завершения этой работы, он просто запускает ее по своему весёлом пути. В вашем случае происходит то, что start-Job создает задание, вы ожидаете одну секунду, а затем перечисляете содержимое каталога журнала. Затем вы достигаете конца скрипта, и как только это произойдет, сеанс прекращается. Вот почему создаются только некоторые из ваших файлов журналов. Сессия заканчивается, потому что вы достигли конца сценария, прежде чем созданная работа имела шанс закончить.

Чтобы использовать задания в соответствии с тем, как вы описываете, вам нужно, чтобы сеанс PowerShell оставался открытым для всего срока службы заданий.Для этого вам понадобится параметр -NoExit в вашей команде PowerShell, которая запускает задание. Вы можете просмотреть около powershell /? для других коммутаторов, которые могут вам пригодиться. Если у вас есть дополнительный креатив с вашим скриптом, который запускает задание, вы можете в конце концов сделать скрытый, неинтерактивный сеанс, который автоматически прекратится после выполнения задания. Но babysteps.

Смежные вопросы