programing

백그라운드 프로세스를 포킹/실행하기 위한 bash 앰퍼샌드(&)와 동등한 Powershell

lastcode 2023. 4. 22. 09:33
반응형

백그라운드 프로세스를 포킹/실행하기 위한 bash 앰퍼샌드(&)와 동등한 Powershell

bash에서는 앰퍼샌드(&)를 사용하여 백그라운드에서 명령을 실행하고 명령어 실행이 완료되기 전에 사용자에게 대화형 제어를 반환할 수 있습니다.Powershell에서도 이와 동등한 방법이 있나요?

bash에서의 사용 예:

 sleep 30 &

명령어가 실행 가능 파일 또는 연결된 실행 가능 파일이 있는 경우 Start-Process(v2에서 사용 가능)를 사용합니다.

Start-Process -NoNewWindow ping google.com

이것을 프로파일에 함수로 추가할 수도 있습니다.

function bg() {Start-Process -NoNewWindow @args}

그러면 호출이 다음과 같이 됩니다.

bg ping google.com

백그라운드에서 프로세스를 실행하는 단순한 사용 사례에 대해 Start-Job은 오버킬이라고 생각합니다.

  1. 시작 작업은 별도의 세션에서 실행되므로 기존 범위에 액세스할 수 없습니다."Start-Job {notepad $myfile}"을(를) 수행할 수 없습니다.
  2. Start-Job은 (다른 세션에서 실행되므로) 현재 디렉토리를 유지하지 않습니다."Start-Job {notepad myfile"을 수행할 수 없습니다.txt}"를 선택합니다.txt는 현재 디렉토리에 있습니다.
  3. 출력은 자동으로 표시되지 않습니다.작업의 ID를 매개 변수로 사용하여 수신 작업을 실행해야 합니다.

메모: 초기 예시에 대해서는 sleep은 Powershell 명령어이므로 "bg sleep 30"은 작동하지 않습니다.시작-프로세스는 실제로 프로세스를 분기할 때만 작동합니다.

6.부터는 PowerShell Core 6.0을 쓸 수 .&이는 현재 작업 디렉토리의 백그라운드에서 파이프라인을 실행하는 것과 같습니다.

하다와 .&bash에서는 현재 PowerShell 작업 기능에 적합한 구문일 뿐입니다.작업에 사용할 다른 모든 명령을 사용할 수 있도록 작업 개체를 반환합니다.예를들면Receive-Job:

C:\utils> ping google.com &

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
35     Job35           BackgroundJob   Running       True            localhost            Microsoft.PowerShell.M...


C:\utils> Receive-Job 35

Pinging google.com [172.217.16.14] with 32 bytes of data:
Reply from 172.217.16.14: bytes=32 time=11ms TTL=55
Reply from 172.217.16.14: bytes=32 time=11ms TTL=55
Reply from 172.217.16.14: bytes=32 time=10ms TTL=55
Reply from 172.217.16.14: bytes=32 time=10ms TTL=55

Ping statistics for 172.217.16.14:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 10ms, Maximum = 11ms, Average = 10ms
C:\utils>

백그라운드에서 몇 가지 문을 실행하는 경우 다음과 같이 연산자, 스크립트 블록 및 이 새로운 백그라운드 연산자를 결합할 수 있습니다.

& { cd .\SomeDir\; .\SomeLongRunningOperation.bat; cd ..; } &

다음은 설명서 페이지의 몇 가지 추가 정보입니다.

PowerShell Core 6.0신기능:

앰퍼샌드(&)를 사용한 파이프라인 백그라운드 지원(#3360)

「 」를 .&PowerShell 업업shell 。파이프라인이 백그라운드로 지정되면 작업 개체가 반환됩니다.되면, 스탠다드 「」가 됩니다.*-Job할 수 .되는 변수변수 는됩니다.따라서 프로세스 고유 변수입니다.Copy-Item $foo $bar &효과가 있습니다.작업은 사용자의 홈 디렉토리 대신 현재 디렉토리에서도 실행됩니다.PowerShell 작업에 대한 자세한 내용은 About_Jobs를 참조하십시오.

about_operators / Ampersand background 연산자 &:

앰퍼샌드 백그라운드 연산자 &

PowerShell 작 power power power power power power power power 。로 유명한 "operator"와 동일하게 합니다.ampersand background는 UNIX "ampersand"입니다. ampersand background와 많은 합니다.Start-Job다음 명령어에는 앰퍼샌드 백그라운드 연산자의 기본 사용법이 포함되어 있습니다.

Get-Process -Name pwsh &

입니다.Start-Job.

Start-Job -ScriptBlock {Get-Process -Name pwsh}

사용법과 Start-Jobampersand background "a"를 합니다.Job꼭 object 객체Start-Job does'아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,Receive-Job ★★★★★★★★★★★★★★★★★」Remove-Job만약 당신이 그것을 사용했다면 할 수 있었을 것이다.Start-Job작업을 시작합니다.

$job = Get-Process -Name pwsh &
Receive-Job $job

산출량

NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
------    -----      -----     ------      --  -- -----------
    0     0.00     221.16      25.90    6988 988 pwsh
    0     0.00     140.12      29.87   14845 845 pwsh
    0     0.00      85.51       0.91   19639 988 pwsh


$job = Get-Process -Name pwsh &
Remove-Job $job

PowerShell 작업에 대한 자세한 내용은 About_Jobs를 참조하십시오.

이 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★Start-Job는, 「」와 되지 않습니다.Start-Job필요한 경우 완전 수식 경로를 지정해야 합니다.

예를 들어 다음과 같습니다.

Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }
ps2> start-job {start-sleep 20}

나는 아직 실시간으로 stdout을 얻는 방법을 알아내지 못했다. start-job은 get-job을 사용하여 stdout을 조사해야 한다.

업데이트: 기본적으로 bash & operator인 원하는 작업을 쉽게 시작할 수 없습니다.여기 지금까지의 내 최고의 해커가 있다

PS> notepad $profile #edit init script -- added these lines
function beep { write-host `a }
function ajp { start powershell {ant java-platform|out-null;beep} } #new window, stderr only, beep when done
function acjp { start powershell {ant clean java-platform|out-null;beep} }
PS> . $profile #re-load profile script
PS> ajp

PowerShell 작업 cmdlet을 사용하여 목표를 달성할 수 있습니다.

PowerShell에서는 6개의 작업 관련 cmdlet을 사용할 수 있습니다.

  • 취업
    • 현재 세션에서 실행 중인 윈도우즈 PowerShell 백그라운드 작업을 가져옵니다.
  • 수신 작업
    • 현재 세션에서 윈도우즈 PowerShell 백그라운드 작업의 결과를 가져옵니다.
  • 작업 제거
    • 윈도우즈 PowerShell 백그라운드 작업을 삭제합니다.
  • 시작 작업
    • 윈도우즈 PowerShell 백그라운드 작업을 시작합니다.
  • 작업 중지
    • 윈도우즈 PowerShell 백그라운드 작업을 중지합니다.
  • 대기 작업
    • 세션에서 실행 중인 하나 또는 모든 윈도우즈 PowerShell 백그라운드 작업이 완료될 때까지 명령 프롬프트를 표시하지 않습니다.

관심 있는 경우 PowerShell에서 백그라운드 작업을 생성하는 방법 샘플을 다운로드할 수 있습니다.

이런 것도 할 수 있어요.

$a = start-process -NoNewWindow powershell {timeout 10; 'done'} -PassThru

그리고 만약 당신이 그것을 기다리십시오.

$a | wait-process

보너스 osx 또는 Linux 버전:

$a = start-process pwsh '-c',{start-sleep 5; 'done'} -PassThru 

제가 가지고 있는 핑거 스크립트 예시입니다.arg는 배열로 전달됩니다.

$1 = start -n powershell pinger,comp001 -pa

dr;dr

Start-Process powershell { sleep 30 }

PowerShell v1.0에서 http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry에 설명된 솔루션을 성공적으로 사용했습니다.PowerShell v2.0에서는 확실히 쉬워집니다.

언급URL : https://stackoverflow.com/questions/185575/powershell-equivalent-of-bash-ampersand-for-forking-running-background-proce

반응형