프로세스가 실행 중인지 여부를 확인하고 이를 사용하여 조건부 쉘 스크립트를 만드는 방법은 무엇입니까?

프로세스가 실행 중인지 여부를 확인하고 이를 사용하여 조건부 쉘 스크립트를 만드는 방법은 무엇입니까?

프로세스가 실행 중인지 확인하고 bash 스크립트가 해당 조건에 따라 일부 항목을 실행하도록 하려면 어떻게 해야 합니까?

예를 들어:

  • abc프로세스가 실행 중이 면 다음을 수행하십시오.

  • 실행 중이 아니면 그렇게 하세요.

답변1

이와 같은 작업을 수행하는 bash 스크립트는 다음과 같습니다.

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

이 스크립트는 "gedit" 프로그램이 실행 중인지 확인하는 것입니다.

또는 다음과 같이 프로그램이 실행되고 있지 않은지 확인할 수도 있습니다.

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi

답변2

ps aux | grep abc이와 유사 하거나 결함이 있는 솔루션을 사용합니다 pgrep abc.

왜?

특정 프로세스가 실행 중인지 확인하는 것이 아니기 때문에 실행 중인 프로세스 중 일치하는 프로세스가 있는지 확인하는 것입니다 abc. 모든 사용자는 이름이 지정된(또는 이름이나 인수의 어딘가에 abc포함된 ) 실행 파일을 쉽게 만들고 실행할 수 있으며 , 이로 인해 테스트에 대해 잘못된 긍정이 발생합니다. 에 적용 하고 검색 범위를 좁힐 수 있는 abc다양한 옵션이 있지만 여전히 신뢰할 수 있는 테스트를 받을 수는 없습니다.psgreppgrep

그렇다면 특정 실행 프로세스를 안정적으로 테스트하려면 어떻게 해야 할까요?

이는 테스트가 필요한 대상에 따라 다릅니다.

나는 그 서비스를 보장하고 싶다알파벳실행 중입니다. 그렇지 않은 경우 시작하세요.

이것이 바로 systemd의 목적입니다. 서비스를 자동으로 시작하고 추적할 수 있으며 서비스가 종료되면 반응할 수 있습니다.

보다내 게임 서버가 아직 실행 중인지 어떻게 확인할 수 있나요?다른 솔루션의 경우.

알파벳내 스크립트입니다. 내 스크립트의 인스턴스가 하나만 실행되고 있는지 확인해야 합니다.

이 경우 lockfile이나 lockdir을 사용하십시오. 예:

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

보다배쉬 FAQ 45다른 잠금 방법의 경우.

답변3

이것이 내가 사용하는 것입니다:

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

일반 영어로:'pgrep'이 0을 반환하면 프로세스가 실행 중인 것이고, 그렇지 않으면 실행되지 않은 것입니다.


관련 자료:

Bash 스크립팅 ::문자열 비교

우분투 매뉴얼pgrep

답변4

@rommel-cid의 아이디어를 살펴보면 pidof|| (||)는 프로세스가 존재하지 않는 경우 명령을 실행하고 &&는 프로세스가 존재하는 경우 무언가를 실행하여 빠른 if/then/else 조건을 생성합니다. 예를 들어 실행 중인 프로세스(프로세스 이름이 "chrome"인 내 Chrome 브라우저)가 있는 프로세스와 존재하지 않는 프로세스에 대한 테스트가 있습니다. 인쇄되지 않도록 1>/dev/null을 사용하여 표준 출력을 억제했습니다.

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$

관련 정보