2013-10-10 35 views
0

我有使用后台进程的理解问题。后台作业过早结束

我必须将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的方式或是我做错了什么吗?

回答

0

在Linux中,后台作业将继续仅推出了具有nohup命令,或者nohuponexit选项在shell设置(或处理,后面用名字命名命令六亲不认)

提示如何运行在PS上可以找到this thread of emails的freelist。

3

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

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

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