1

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

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

4

2 回答 2

4

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

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

要以您描述的方式使用作业,您需要 PowerShell 会话在作业的整个生命周期内保持启动状态。为此,您需要-NoExit运行作业的 PowerShell 命令中的参数。您可能想四处浏览powershell /?可能有用的其他开关。如果您的脚本开始工作时有额外的创意,您最终可以创建一个隐藏的、非交互式的会话,一旦工作完成就会自动退出。但是婴儿步。

于 2013-10-10T19:56:26.747 回答
0

在 linux 上,后台作业只有在使用 nohup 命令启动,或者在 shell 中设置了 nohuponexit 选项时才会继续运行(或者该进程后来被 eponym 命令取消)

可以在 freelist 上的此电子邮件线程中找到有关如何使用 PS 执行相同操作的提示。

于 2013-10-10T19:37:27.127 回答