programing

프로세스가 실행 중인지 올바르게 확인하고 프로세스를 중지하는 방법

stoneblock 2023. 5. 29. 09:16

프로세스가 실행 중인지 올바르게 확인하고 프로세스를 중지하는 방법

FireFox와 같이 프로세스가 실행 중인지 여부를 확인하고 중지하는 올바른 방법은 FireFox)?

둘러본 결과 가장 좋은 방법은 다음과 같습니다.

if((get-process "firefox" -ea SilentlyContinue) -eq $Null){ 
        echo "Not Running" 
}

else{ 
    echo "Running"
    Stop-Process -processname "firefox"
 }

이것이 그것을 하는 이상적인 방법입니까?그렇지 않다면 올바른 방법은 무엇입니까?

프로세스에 대해 두 번 문의하는 방식입니다.또한 린은 먼저 친절한 것에 대해 좋은 점을 제기합니다.저는 아마 다음과 같은 방법을 시도할 수 있습니다.

# get Firefox process
$firefox = Get-Process firefox -ErrorAction SilentlyContinue
if ($firefox) {
  # try gracefully first
  $firefox.CloseMainWindow()
  # kill after five seconds
  Sleep 5
  if (!$firefox.HasExited) {
    $firefox | Stop-Process -Force
  }
}
Remove-Variable firefox

정확한 결과 "실행 중" / "실행되지 않음"을 표시할 필요가 없는 경우 다음을 간단히 수행할 수 있습니다.

ps notepad -ErrorAction SilentlyContinue | kill -PassThru

프로세스가 실행되고 있지 않으면 결과가 표시되지 않습니다.실행 중이었다면 다음과 같은 메시지가 표시됩니다.get-process출력하면 프로세스가 중지됩니다.

@jmp242 - 제네릭System.Object유형에 다음이 포함되어 있지 않습니다.CloseMainWindow방법, 그러나 정적 캐스팅System.Diagnostics.Process수집할 때 입력합니다.ProcessList변수는 저에게 효과가 있습니다.이 주조로 코드(이 답변에서) 업데이트됨(사용하도록 루프 변경됨)ForEach-Object)은 아래에 있습니다.

function Stop-Processes {
    param(
        [parameter(Mandatory=$true)] $processName,
                                     $timeout = 5
    )
    [System.Diagnostics.Process[]]$processList = Get-Process $processName -ErrorAction SilentlyContinue

    ForEach ($Process in $processList) {
        # Try gracefully first
        $Process.CloseMainWindow() | Out-Null
    }

    # Check the 'HasExited' property for each process
    for ($i = 0 ; $i -le $timeout; $i++) {
        $AllHaveExited = $True
        $processList | ForEach-Object {
            If (-NOT $_.HasExited) {
                $AllHaveExited = $False
            }                    
        }
        If ($AllHaveExited -eq $true){
            Return
        }
        Start-Sleep 1
    }
    # If graceful close has failed, loop through 'Stop-Process'
    $processList | ForEach-Object {
        If (Get-Process -ID $_.ID -ErrorAction SilentlyContinue) {
            Stop-Process -Id $_.ID -Force -Verbose
        }
    }
}

고마워요 @Joey.그것이 제가 찾고 있는 것입니다.

저는 단지 몇 가지 개선 사항을 가져올 뿐입니다.

  • 여러 프로세스를 고려함
  • 모든 프로세스가 종료된 시간 제한에 도달하지 않도록 하기 위해
  • 전체를 함수로 포장하기

function Stop-Processes {
    param(
        [parameter(Mandatory=$true)] $processName,
                                     $timeout = 5
    )
    $processList = Get-Process $processName -ErrorAction SilentlyContinue
    if ($processList) {
        # Try gracefully first
        $processList.CloseMainWindow() | Out-Null

        # Wait until all processes have terminated or until timeout
        for ($i = 0 ; $i -le $timeout; $i ++){
            $AllHaveExited = $True
            $processList | % {
                $process = $_
                If (!$process.HasExited){
                    $AllHaveExited = $False
                }                    
            }
            If ($AllHaveExited){
                Return
            }
            sleep 1
        }
        # Else: kill
        $processList | Stop-Process -Force        
    }
}

프로세스 킬링부터 시작해보자면, 여기.python내 2센트:

Get-Process python3.9|Stop-Process

언급URL : https://stackoverflow.com/questions/28481811/how-to-correctly-check-if-a-process-is-running-and-stop-it