我对使用后台进程有一个理解的问题。
我必须将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 :(得分: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中找到。