프로세스가 실행 중인지 확인하고 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
다양한 옵션이 있지만 여전히 신뢰할 수 있는 테스트를 받을 수는 없습니다.ps
grep
pgrep
그렇다면 특정 실행 프로세스를 안정적으로 테스트하려면 어떻게 해야 할까요?
이는 테스트가 필요한 대상에 따라 다릅니다.
나는 그 서비스를 보장하고 싶다알파벳실행 중입니다. 그렇지 않은 경우 시작하세요.
이것이 바로 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
답변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
$