PowerShell에서 분리된 백그라운드 프로세스 시작
리눅스에서 데몬이 실행되는 방식과 유사한 파워쉘 스크립트에서 백그라운드 프로세스로 시작하고자 하는 자바 프로그램이 있습니다.PowerShell 스크립트는 다음과 같은 몇 가지 작업을 수행해야 합니다.
- 백그라운드에서 별도의 분리된 프로세스로 프로그램을 실행합니다. 즉, 상위 창을 닫고 프로세스를 계속 실행할 수 있습니다.
- 프로그램의 표준 출력과 표준 오류를 파일로 리디렉션합니다.
- 백그라운드 프로세스의 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
:
(참고: 이것은 Windows용이 아닙니다.
언급URL : https://stackoverflow.com/questions/25023458/start-a-detached-background-process-in-powershell
'programing' 카테고리의 다른 글
Swift의 '해결되지 않은 식별자 사용' (0) | 2023.10.07 |
---|---|
우커머스 주문키 받기 (0) | 2023.10.07 |
다른 브라우저의 다른 응답 (0) | 2023.10.07 |
두스 포스트그레SQL에 Oracle의 "LEVEL"과 같은 유사 열이 있습니까? (0) | 2023.10.02 |
MariaDB - PHP - Form 제출 시 테이블에 데이터가 삽입되지 않음 (0) | 2023.10.02 |