【发布时间】:2014-09-21 07:20:44
【问题描述】:
我有一个 Java 程序,我想从 PowerShell 脚本作为后台进程启动它,类似于守护程序在 Linux 上运行的方式。 PowerShell 脚本需要做几件事:
- 在后台将程序作为单独的分离进程运行,这意味着可以关闭父窗口并继续运行。
- 将程序的标准输出和标准错误重定向到文件。
- 将后台进程的 PID 保存到文件中,以便稍后可以由另一个脚本终止。
我在 Linux 上有一个 shell 脚本,它可以像这样启动程序:
$ java -jar MyProgram.jar >console.out 2>console.err &
我希望使用 PowerShell 脚本在 Windows 上复制相同的行为。我曾尝试将Start-Process 与各种选项组合一起使用,以及创建System.Diagnostics.ProcessStartInfo 和System.Diagnostics.Process 对象,但到目前为止我没有任何运气。 PowerShell 将程序作为后台进程启动,但当启动 PowerShell 会话的 DOS 窗口关闭时,程序会突然终止。我希望它在后台启动并且独立于启动它的命令窗口。
输出重定向也很麻烦,因为似乎只能在同一窗口中运行的进程中重定向输出和错误流(例如,使用-NoNewWindow)。
这种事情在 PowerShell 中是否可行?
【问题讨论】:
-
您需要有 Powershell v3 或更高版本,并使用
Start-PSSessioncmdlet -
由于您使用的是 Powershell 2,因此这是 stackoverflow.com/questions/185575/… 的副本
-
我在以前的谷歌搜索中看到了该帖子,但我认为该问题的 OP 并不是要关闭原始命令窗口并仍然保持后台作业运行。当您在 Linux 上执行此操作时,“孤立的”后台进程只是成为系统进程的子进程。不过,Windows 似乎不喜欢这种东西。它是否有任何机制在父进程关闭后保持进程运行?
-
stackoverflow.com/questions/23091731/… ... 使用 WMI 创建分离的进程。总帐
-
您不需要 Powershell 来执行此操作,只需使用名为 Start 的 CMD.EXE(DOS 会话多年来不再意味着任何东西)命令。一旦你这样做了,结果将是一个分离的进程,但不是一个守护进程,如果你关闭你的交互式会话,分离的进程将会死掉。真正等同于守护进程的是 Wndows OS 上的服务。
标签: windows powershell