프로세스가 실행 중인지 여부를 확인한 다음 bash 스크립트가 해당 조건에 따라 일부 작업을 실행하도록하려면 어떻게해야합니까?
예를 들면 다음과 같습니다.
프로세스
abc
가 실행 중이면이 작업을 수행하십시오.실행 중이 아니면 그렇게하십시오.
프로세스가 실행 중인지 여부를 확인한 다음 bash 스크립트가 해당 조건에 따라 일부 작업을 실행하도록하려면 어떻게해야합니까?
예를 들면 다음과 같습니다.
프로세스 abc
가 실행 중이면이 작업을 수행하십시오.
실행 중이 아니면 그렇게하십시오.
답변:
이와 같은 작업을 수행하는 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
/dev/null
: "/ dev / null은 명령 표준 출력을 널 장치로 리디렉션합니다.이 명령은 쓰여진 정보를 버리는 특수한 장치입니다. ...를 사용 0
하여 명령 출력을이라는 파일로 리디렉션합니다 0
. 이 경우 > /dev/null
출력을 버리는 표준 / 올바른 방법이므로 어디에서나 볼 수 있습니다.
-x
매개 변수를 추가하십시오. pgrep
그렇지 않으면 다른 응용 프로그램 이름에서 동일한 문자열을 찾으면 잘못된 값을 얻습니다. 나는 그것을 알아 내기 위해 1 시간을 보냈습니다.
! pgrep
비슷한 것을 사용 ps aux | grep abc
하거나 pgrep abc
결함이있는 솔루션 .
특정 프로세스가 실행 중인지 확인하지 않기 때문에 실행중인 프로세스가 일치하는지 확인하고 있습니다 abc
. 모든 사용자는 이름이 지정된 abc
(또는 abc
이름 또는 인수에 포함 된) 실행 파일을 쉽게 작성하고 실행할 수 있으므로 테스트에 대한 오 탐지가 발생합니다. 이 당신이에 적용 할 수있는 다양한 옵션이 있습니다 ps
, grep
및 pgrep
검색 범위를 좁힐,하지만 당신은 여전히 신뢰할 수있는 시험을받지 않습니다.
테스트가 필요한 대상에 따라 다릅니다.
이것이 init과 upstart를위한 것입니다. 서비스를 시작하고 pid가 pidfile에 저장되도록합니다. init 또는 upstart를 통해 서비스를 다시 시작하면 pidfile을 확인한 다음 pidfile이없는 경우 시작하거나 이미 실행중인 경우 중단합니다. 이것은 여전히 100 % 신뢰할 수는 없지만 최대한 가깝습니다.
참조 내 게임 서버가 계속 실행되고 있는지 ... 확인할 수 있습니다 어떻게 다른 솔루션.
이 경우 잠금 파일 또는 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 를 참조하십시오 .
pgrep
거나 ps
완벽하게 적합하며 접근 방식이 과도하게 보입니다. 그러나 공개 배포 용 스크립을 작성하는 경우 가능한 가장 안전한 방법으로 작성해야합니다.
rm
명령이 실행됩니다. 트랩을 설정 한 후에 끝나는 한 잠금 장치를 제거해야합니다.
이것이 내가 사용하는 것입니다 :
#!/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
실패 할 수도 있습니다.
-x
옵션 을 사용하십시오 : "이름 (또는 -f가 지정된 경우 명령 행)이 패턴과 정확히 일치하는 프로세스 만 일치시킵니다."
@ 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
$
확인 해야하는 바이너리가 시스템 전체에 설치되어 있지 않기 때문에 "간단한"솔루션이 효과가 없었으므로 경로를 확인해야합니다 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
@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
## 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
#!/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
zombie
프로세스 와 같은 다른 상태의 프로그램으로 나를 데려 갔다 .STAT
의 출력ps
에서 표시 되는 열 값 의 전체 목록 은 여기 에 해당하는 답변을 쓰거나 자신이 편집하는 경향이있는 사용자를위한 것입니다.