windows 在PowerShell中启动分离的后台进程

p5cysglq  于 2023-01-21  发布在  Windows
关注(0)|答案(6)|浏览(232)

我有一个Java程序,我想从PowerShell脚本启动它作为后台进程,类似于守护进程在Linux上运行的方式。PowerShell脚本需要做几件事:
1.在后台将程序作为一个独立的进程运行,这意味着父窗口可以关闭,进程可以继续运行。
1.将程序的标准输出和标准错误重定向到文件。
1.将后台进程的PID保存到一个文件中,以便稍后可以由另一个脚本终止它。
我在Linux上有一个shell脚本,它像这样启动程序:

$ java -jar MyProgram.jar >console.out 2>console.err &

我希望使用PowerShell脚本在Windows上复制相同的行为。我尝试过使用Start-Process和各种选项组合,以及创建System.Diagnostics.ProcessStartInfoSystem.Diagnostics.Process对象,但到目前为止我没有任何运气。PowerShell作为后台进程启动程序,但是当启动PowerShell会话的DOS窗口关闭时,该程序突然终止。我希望它在后台启动,并且独立于启动它的命令窗口。
输出重定向也很麻烦,因为输出和错误流似乎只能在同一窗口中运行的进程中重定向(例如,使用-NoNewWindow)。
这类事情在PowerShell中可能吗?

kupeojn6

kupeojn61#

使用jobs执行以下操作:

Start-Job -ScriptBlock {
  & java -jar MyProgram.jar >console.out 2>console.err
}

另一个选项是Start-Process

Start-Process java -ArgumentList '-jar', 'MyProgram.jar' `
  -RedirectStandardOutput '.\console.out' -RedirectStandardError '.\console.err'
vzgqcmou

vzgqcmou2#

考虑使用任务调度器来完成这个任务。定义一个任务并设置它而不使用任何触发器。这将允许你简单地“运行”(手动触发)任务。
您可以使用ScheduledTasks powershell模块设置和/或触发计划任务,也可以使用GUI。

qzlgjiam

qzlgjiam3#

这是一个老帖子,但因为我有它的工作很好,认为它可能有助于分享。这是调用'java'而不是'javaw',这可能是你的问题。运行了我自己使用我的JEdit java程序通过powershell启动它。

#Requires -Version 3.0
$MyDriveRoot = (Get-Location).Drive.Root
$JEditDir = $($mydriveroot + "jEdit") ;# Should be C:\jEdit or wherever you want. JEdit is a sub-directory.
$jEdit = $($JEditDir + "\jedit.jar" )
$jEditSettings = $($JEditDir + "\settings")
$JEditLogs = $($JEditDir + "\logs")

Start-Process -FilePath javaw -ArgumentList ( '-jar',"$jEdit", '-settings="$JEditSettings"' ) -RedirectStandardOutput "$JEditLogs\console.out" -RedirectStandardError "$JEditLogs\console.err"

您可以将其转换为一个小函数,然后再转换为一个别名,以便在Powershell中轻松启动。

If ( ( Test-Path $jedit) ) {
    Function Start-JEdit() {
        Start-Process -FilePath javaw -ArgumentList ( '-jar',"$jEdit", '-settings="$($mydriveroot + "jEdit\settings")"' ) -RedirectStandardOutput "$JEditLogs\console.out" -RedirectStandardError "$JEditLogs\console.err"
    }
New-Alias -Name jedit  -Force Start-JEdit  -Description "Start JEdit programmers text editor" 
}
bqf10yzr

bqf10yzr4#

老问题了,但因为我有同样的目标,我用@use的答案来实现它。
下面是我的代码:)

$NAME_TASK = "myTask"
$NAME_TASKPATH = "\myPath\"

if ($args[0] -eq "-task") {
  # Code to be run "detached" here...
  Unregister-ScheduledTask -TaskName $NAME_TASK -TaskPath $NAME_TASKPATH -Confirm:$False
  Exit
}

$Task = (Get-ScheduledTask -TaskName $NAME_TASK -TaskPath $NAME_TASKPATH -ErrorAction 'SilentlyContinue')
if ($Task) {
  Write-Host "ERR: Task already in progress"
  Exit 1
}

$A = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-ExecutionPolicy bypass -NoProfile -Command ""$PSCommandPath -task $args"""
Register-ScheduledTask -TaskName $NAME_TASK -TaskPath $NAME_TASKPATH -Action $A | Start-ScheduledTask
vwkv1x7d

vwkv1x7d5#

尝试使用PowerShell执行此操作:

Start-Process cmd -Args /c,"java -jar MyProgram.jar" `
  -WindowStyle Hidden -RSI console.out -RSE console.err

Start-Process cmd -Args /c,"java -jar MyProgram.jar >console.out 2>console.err" `
  -WindowStyle Hidden

这将启动一个隐藏的分离cmd窗口,并相应地重定向std流。

f3temu5u

f3temu5u6#

解决方案是将Start-Processnohup组合:
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.1#example-8--create-a-detached-process-on-linux

相关问题