programing

PowerShell에서 분리된 백그라운드 프로세스 시작

yellowcard 2023. 10. 7. 09:46
반응형

PowerShell에서 분리된 백그라운드 프로세스 시작

리눅스에서 데몬이 실행되는 방식과 유사한 파워쉘 스크립트에서 백그라운드 프로세스로 시작하고자 하는 자바 프로그램이 있습니다.PowerShell 스크립트는 다음과 같은 몇 가지 작업을 수행해야 합니다.

  1. 백그라운드에서 별도의 분리된 프로세스로 프로그램을 실행합니다. 즉, 상위 창을 닫고 프로세스를 계속 실행할 수 있습니다.
  2. 프로그램의 표준 출력과 표준 오류를 파일로 리디렉션합니다.
  3. 백그라운드 프로세스의 PID를 파일에 저장하면 나중에 다른 스크립트로 종료할 수 있습니다.

리눅스에서 셸 스크립트를 사용하면 프로그램을 다음과 같이 시작할 수 있습니다.

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

저는 파워쉘 스크립트를 사용하여 Windows에서 동일한 동작을 복제하고자 합니다.사용해 보았습니다.Start-Process다양한 옵션 조합과 함께 생성할 수 있습니다.System.Diagnostics.ProcessStartInfo그리고.System.Diagnostics.Process물건들인데, 지금까지 운이 없습니다.PowerShell은 백그라운드 프로세스로 프로그램을 시작하지만, PowerShell 세션을 시작한 DOS 창이 닫히면 프로그램이 갑자기 종료됩니다.백그라운드에서 시작해서 시작한 명령 창에서 독립적으로 시작했으면 좋겠습니다.

출력 리디렉션은 프로세스에서 출력 및 오류 스트림만 리디렉션할 수 있는 것처럼 보이기 때문에 문제가 되었습니다(예: 사용).-NoNewWindow).

파워쉘에서 이런 일이 가능한가요?

작업을 다음 작업에 사용:

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

다른 옵션은 다음과 같습니다.

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

이를 위해 작업 스케줄러를 사용하는 것을 고려해 봅니다.트리거 없이 작업을 정의하고 설정합니다.그러면 작업을 간단히 "실행"(수동으로 트리거)할 수 있습니다.

ScheduledTasks powershell 모듈을 사용하여 스케줄링된 작업을 설정 및/또는 트리거하거나 GUI를 사용할 수 있습니다.

이것은 오래된 게시물이지만 잘 작동하기 때문에 공유하는 데 도움이 될 것이라고 생각했습니다.당신의 문제일 가능성이 높은 것은 'javaw' 대신 'java'를 부르는 것입니다.파워셸을 통해 JEdit 자바 프로그램을 사용하여 직접 실행하여 실행했습니다.

#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"

작은 기능으로 바꿀 수 있고 파워셸에서 쉽게 시작할 수 있도록 가명을 만들 수 있습니다.

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" 
}

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 스트림이 리디렉션됩니다.

오래된 질문이지만 같은 목표를 가지고 있었기 때문에 @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

@Ansgar의 답변을 완성하고, 형식을 전혀 수정하지 않고도 터미널에서 실행할 수 있는 완전한 원라이너를 제공하려면:

(), 입니다()와 할 수 입니다.stdout그리고.stderr) =>

Start-Job -ScriptBlock { & command >$null 2>$null }
추신: 주황색 텍스트는 사용자 자신의 값으로 교체해야 합니다.

은 입니다를 입니다.Start-Process와 함께nohup:

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.3#example-9-create-a-detached-process-on-linux

(참고: 이것은 Windows용이 아닙니다.

언급URL : https://stackoverflow.com/questions/25023458/start-a-detached-background-process-in-powershell

반응형