后台工作提前结束

时间:2013-10-10 19:15:45

标签: powershell start-job

我对使用后台进程有一个理解的问题。

我必须将Linux上的处理逻辑转换为Windows。我有一个剧本,在其处理中,在其他人中发布,另一个背景剧本,并追求它的处理。抛出(启动)治疗背景的脚本不必关心这个的结果,因此即使在背景中的治疗仍然执行也必须结束。

我在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一样的假设,还是我做错了什么?

2 个答案:

答案 0 :(得分:4)

当您使用-Command开关启动PowerShell时,它会运行提供的命令,然后退出会话。 PowerShell中的作业特定于它们启动的会话。如果您想通过启动PowerShell的两个实例(会话),您可以自己查看。在一个中创建一个工作,例如start-Job {sleep 600}get-Job,您会看到作业是Running。如果您在其他 PowerShell实例中输入get-Job,您将看到没有工作。

start-Job cmdlet正在创建一个作业,但它不会等待该作业完成,它只是以快乐的方式启动它。在你的情况下,正在发生的事情是start-Job正在创建作业,你等待一秒钟,然后列出日志目录的内容。然后到达脚本的末尾,一旦发生,会话终止。这就是为什么只创建了一些日志文件的原因。会话正在结束,因为在创建的作业有机会完成之前,您已到达脚本的末尾。

以您描述的方式使用作业,您需要PowerShell会话在整个作业的生命周期内保持启动状态。为此,您需要运行该作业的PowerShell命令上的-NoExit参数。您可能希望浏览powershell /?以查找可能对您有用的其他开关。如果您使用启动作业的脚本获得了额外的创意,则最终可以创建一个隐藏的非交互式会话,该会话在作业完成后自动退出。但宝贝步骤。

答案 1 :(得分:0)

在linux上,后台作业将仅在使用nohup命令启动时继续运行,或者在shell中设置nohuponexit选项(或者稍后使用eponym命令取消该进程)

关于如何对PS做同样的提示可以在freelist的this thread of emails中找到。