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


108

프로세스가 실행 중인지 여부를 확인한 다음 bash 스크립트가 해당 조건에 따라 일부 작업을 실행하도록하려면 어떻게해야합니까?

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

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

  • 실행 중이 아니면 그렇게하십시오.


1
아래 솔루션 중 어느 것도 프로세스 상태를 고려하지 않는다는 점에 유의하십시오. 내 질문 중 하나에 대한 의견 이 나를 여기로 데려 왔지만 그것에 대한 대답zombie프로세스 와 같은 다른 상태의 프로그램으로 나를 데려 갔다 . STAT의 출력 ps에서 표시 되는 열 값 의 전체 목록 은 여기 에 해당하는 답변을 쓰거나 자신이 편집하는 경향이있는 사용자를위한 것입니다.
user66001 2013 년


프로세스를 확인하는 가장 좋은 방법은 다음과 같습니다. stackoverflow.com/questions/3043978/…
Trevor Boyd Smith

답변:


166

이와 같은 작업을 수행하는 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

@DreadPirateShawn 왜 단순히 0이 아닌 / dev / null을 사용하는지 말해 줄 수 있습니까? 숫자를 사용하면 적어도 멍청한 놈 (예 : 나와 같은)의 코드를 더 읽기 쉽게 만듭니다. 리디렉션 없음, 아무것도 없음
Silviu

2
@Silviu 허? 인터넷 검색 /dev/null: "/ dev / null은 명령 표준 출력을 널 장치로 리디렉션합니다.이 명령은 쓰여진 정보를 버리는 특수한 장치입니다. ...를 사용 0하여 명령 출력을이라는 파일로 리디렉션합니다 0. 이 경우 > /dev/null출력을 버리는 표준 / 올바른 방법이므로 어디에서나 볼 수 있습니다.
DreadPirateShawn 5

고마워, 나는 프로그램이 실행되기 전에 실행 중인지 확인하는 멋진 작은 스크립트에 이것을 사용했다. (Google 크롬의 실행 파일이 실행 명령과 이름이 같지 않기 때문에 조금 확장해야했지만 실행 파일 이름은 크롬입니다.)
Cestarian

3
정확한 응용 프로그램을 찾도록 -x매개 변수를 추가하십시오. pgrep그렇지 않으면 다른 응용 프로그램 이름에서 동일한 문자열을 찾으면 잘못된 값을 얻습니다. 나는 그것을 알아 내기 위해 1 시간을 보냈습니다.
Thanos Apostolou

1
프로그램이 실행되고 있지 않은지 확인하려면! pgrep
Mohammed Noureldin

36

비슷한 것을 사용 ps aux | grep abc하거나 pgrep abc결함이있는 솔루션 .

왜?

특정 프로세스가 실행 중인지 확인하지 않기 때문에 실행중인 프로세스가 일치하는지 확인하고 있습니다 abc. 모든 사용자는 이름이 지정된 abc(또는 abc이름 또는 인수에 포함 된) 실행 파일을 쉽게 작성하고 실행할 수 있으므로 테스트에 대한 오 탐지가 발생합니다. 이 당신이에 적용 할 수있는 다양한 옵션이 있습니다 ps, greppgrep검색 범위를 좁힐,하지만 당신은 여전히 신뢰할 수있는 시험을받지 않습니다.

그렇다면 특정 실행중인 프로세스를 어떻게 안정적으로 테스트합니까?

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

서비스 abc 가 실행되고 있는지 확인 하고 그렇지 않은 경우 시작하십시오.

이것이 init과 upstart를위한 것입니다. 서비스를 시작하고 pid가 pidfile에 저장되도록합니다. init 또는 upstart를 통해 서비스를 다시 시작하면 pidfile을 확인한 다음 pidfile이없는 경우 시작하거나 이미 실행중인 경우 중단합니다. 이것은 여전히 ​​100 % 신뢰할 수는 없지만 최대한 가깝습니다.

참조 내 게임 서버가 계속 실행되고 있는지 ... 확인할 수 있습니다 어떻게 다른 솔루션.

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

이 경우 잠금 파일 또는 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 ...

다른 잠금 방법은 Bash FAQ 45 를 참조하십시오 .


3
이것은 기술적으로 사실이지만, 실제로는 실생활에서 그러한 문제가 발생했습니다. 대부분의 프로그램은 스크립트를 손상시키는 방식으로 이름을 변경하지 않습니다. 따라서 간단한 스크립트의 경우와 같 pgrep거나 ps완벽하게 적합하며 접근 방식이 과도하게 보입니다. 그러나 공개 배포 용 스크립을 작성하는 경우 가능한 가장 안전한 방법으로 작성해야합니다.
Scott Severance

2
@ScottSeverance 프로그램 이름 변경은 문제가되지 않습니다. 상관없이 개입이 필요합니다. 동일한 프로그램을 실행하는 다른 사용자 또는 비슷한 이름의 다른 프로그램으로 갑자기 스크립트가 오탐 (false positive)을 일으켜 잘못된 일을하는 것입니다. 나는 단지 "주로 작품"보다는 "작품"을 선호합니다.
geirha

2
내가 틀렸다. 그러나 우리 중 많은 사람들이 단일 사용자 시스템을 운영하고 있습니다. 그리고 여러 사용자 상황에서 사용자 이름을 쉽게 잡을 수 있습니다.
Scott Severance

1
런타임 중에 스크립트가 실패하고 파일을 잠금 해제하기 전에 죽으면 어떻게됩니까?
jp093121

2
@ jp093121 스크립트가 종료되면 EXIT 트랩이 트리거됩니다. 스크립트 끝, 종료 명령에 도달하여 종료하는지 또는 처리 할 수있는 신호를 수신하는지에 관계없이 rm명령이 실행됩니다. 트랩을 설정 한 후에 끝나는 한 잠금 장치를 제거해야합니다.
geirha

18

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

#!/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


고맙습니다!
나도

pgrep예를 들어 앞에서 언급 한 것과 같은 15 자 (한도)의 '기능'을 가지고 있으므로 pgrep gnome-power-manager실패 할 수도 있습니다.
Thorsen

1
pgrep -x옵션 을 사용하십시오 : "이름 (또는 -f가 지정된 경우 명령 행)이 패턴과 정확히 일치하는 프로세스 만 일치시킵니다."
Alastair 어바인

5

나는 보통 pidof -x $(basename $0)스크립트가 이미 실행되고 있는지 확인하기 위해 스크립트를 가지고 있습니다 .


2

@ rommel-cid의 아이디어를 인용 pidof하면 || (||) 프로세스가 존재하지 않으면 명령을 실행하고 && 프로세스가 존재하면 무언가를 실행하여 빠른 if / then / else 조건부를 작성합니다. 예를 들어 실행중인 프로세스 (프로세스 이름이 "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
$

1

확인 해야하는 바이너리가 시스템 전체에 설치되어 있지 않기 때문에 "간단한"솔루션이 효과가 없었으므로 경로를 확인해야합니다 ps -ef | grep.

app="$_sdir/Logic 1.2.18 (64-bit)/Logic"

app_pid=`ps -ef | grep "$app" | awk '{print $2}'`

if `ps -p $app_pid > /dev/null`; then
    echo "An instance of logic analyzer is appear to be running."
    echo "Not starting another instance."
    exit 5
else
    nohup "$app" &> /dev/null &
fi

0

귀하의 문제에 대해 내 생각에 가장 먼저 온 것은
ps aux | grep -i abc프로세스가 실행 중이면 세부 정보를 표시합니다. 당신은 실행 라인과 시간의 수와 일치하거나 제로 또는 다른 조작과 비교할 수 있습니다. 위 명령을 실행하면 최소한 한 줄의 출력, 즉 thi grep 명령으로 생성 된 프로세스에 대한 세부 정보가 표시됩니다. 따라서주의하십시오.
그것은 간단한 해킹으로해야합니다. bash 스크립트에 넣고 도움이되는지 확인하십시오.


0

사용 start-stop-daemon:

/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2

일반 사용자로 작동합니다.


0

@John Vrbanac이 게시 한 답변이 저에게 효과가 없으며 @geirha가 게시 한 답변이 원래 질문에 대한 답변이 아님을 발견했습니다.

John Vrbanac의 솔루션이 PHP 프로세스가 실행 중인지 여부를 확인하지 못했습니다. CentOS 7을 실행 중입니다.

@geirha의 답변은 다른 인스턴스를 시작하기 전에 인스턴스가 이미 실행되고 있지 않은지 확인합니다. 이것은 원래 질문이 아니며 원래 질문은 프로세스가 실행 중인지 확인하는 것이 었습니다.

나를 위해 일한 것은 다음과 같습니다.

내 프로세스의 프로세스 이름에 "Jane"이라는 문자열이 있다고 가정 해보십시오. 실행 중인지 여부를 찾습니다. 이것은 BASH 및 PHP 스크립트에서 작동합니다.

ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
    echo "It's running"
else
    echo "It's not running"
fi

1
아, 여기는 우분투 Q & A 사이트 일뿐입니다. 여기서 리눅스가 주제가 아니기 때문에 여기에있는 답변 중 일부가 CentOS 7에서 작동하지 않는 것은 놀라운 일이 아닙니다. 다른 Linux 버전은 unix.stackexchange.com
Geek

답변 작성자가 CentOS를 사용하지만이 답변은 여전히 ​​우분투에 유효합니다.
Phillip -Zyan K Lee- Stockmann

0
## bash

## function to check if a process is alive and running:

_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

## example 1: checking if "gedit" is running

if _isRunning gedit; then
    echo "gedit is running"
else
    echo "gedit is not running"
fi

## example 2: start lxpanel if it is not there

if ! _isRunning lxpanel; then
    lxpanel &
fi

## or

_isRunning lxpanel || (lxpanel &)

참고 : pgrep -x lxpanel또는 기능 이 부족하더라도 실행중인 pidof lxpanel보고서 lxpanel(좀비); 그래서 살아-및 실행 프로세스를 얻기 위해, 우리는 사용할 필요 ps하고grep


-1

2016 년 9 월 23 일부터 pgrep은 muru의 스크립트가 작동하기 위해 "-x"옵션이 필요한 것으로 보입니다.

#!/bin/bash

if pgrep -x "conky" > /dev/null 2>&1
then
  echo "conky running already"
else
  echo "now starting conky"
  conky
fi
exit 0

Ubuntu 16.04.1 컴퓨터에서 위 스크립트를 시도하고 테스트했습니다. 즐겨!


-1
#!/bin/bash
while [ true ]; do     # Endless loop.
  pid=`pgrep -x ${1}`  # Get a pid.
  if [ -z $pid ]; then # If there is none,
    ${1} &             # Start Param to background.
  else
    sleep 60           # Else wait.
  fi
done

1
Ask Ubuntu에 오신 것을 환영합니다! 이 답변을 편집 하여 이것이 수행하는 작업에 대한 특정 세부 정보로 확장하는 것이 좋습니다 . ( AskUbuntu에서 어떤 종류의 답변이 가장 가치있는 것으로 간주되는지에 대한 일반적인 조언은 좋은 답변을 작성하는 방법을 참조하십시오 .)
David Foerster

-3

isProcessRunning () {if [$ (pidof $ 1)> / dev / null]; retval = 'true'; 그렇지 않으면 retval = 'false'; fi; 에코 $ retval; }

isProcessRunning geany

참된

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.