답변:
동안 pidof
과 pgrep
실행의 무엇을 결정하기위한 훌륭한 도구, 그들은 불행하게도, 모두 일부 운영 체제에서 사용할 수 없습니다. 확실한 안전 장치는 다음을 사용하는 것입니다.ps cax | grep command
Gentoo Linux의 출력 :
14484? S 0:00 apache2 14667? S 0:00 apache2 19620? SL 0:00 apache2 21132? SS 0:04 apache2
OS X의 출력 :
42582? Z 0 : 00.00 (smbclient) 46529 ?? Z 0 : 00.00 (smbclient) 46539 ?? Z 0 : 00.00 (smbclient) 46547? Z 0 : 00.00 (smbclient) 46586 ?? Z 0 : 00.00 (smbclient) 46594? Z 0 : 00.00 (smbclient)
Linux와 OS X 모두에서 grep은 종료 코드를 반환하므로 프로세스가 발견되었는지 여부를 쉽게 확인할 수 있습니다.
#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
또한 PID 목록을 원하면 해당 PID도 쉽게 grep 할 수 있습니다.
ps cax | grep httpd | grep -o '^ [] * [0-9] *'
Linux 및 OS X에서 동일한 출력 :
3519 3521 3523 3524
다음의 출력은 빈 문자열로, 실행되지 않는 프로세스에 대해이 접근 방식을 안전하게 만듭니다.
에코 ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'
이 접근 방식은 간단한 빈 문자열 테스트를 작성한 다음 발견 된 PID를 반복하는 데 적합합니다.
#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
echo "Process not running." 1>&2
exit 1
else
for PID in $PIDS; do
echo $PID
done
fi
실행 권한 (chmod + x 실행 중)을 사용하여 파일 ( "실행 중"이라고 함)에 저장하고 매개 변수를 사용하여 실행하여 테스트 할 수 있습니다. ./running "httpd"
#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
경고!!!
ps ax
Linux 출력에서 볼 수 있듯이 단순히 출력을 구문 분석하는 것입니다. 이는 단순히 프로세스에서 일치하는 것이 아니라 해당 프로그램에 전달 된 인수도 일치한다는 것을 의미합니다. 이 방법을 사용할 때 가능한 한 구체적으로 작성하는 것이 좋습니다 (예 : ./running "mysql"
'mysqld'프로세스와도 일치). which
가능한 경우 전체 경로를 확인 하는 데 사용 하는 것이 좋습니다 .
참조 :
grep
또한 자체가 예 (실행 찾을 수 ps cax | grep randomname
있기 때문에 항상 0을 반환 grep
발견이 grep randomname
) ... (이 분명 희망 한 수정 예를 들어, 프로세스 이름의 첫 글자, 대괄호를 추가하는 것입니다. ps cax | grep [r]andomname
.
ps cax | rev | cut -f1 -d' ' | rev
더 쉬운 구문 분석을 위해 이름 열만 표시합니다.
ps cax
명령 이름 전체를 출력하지 못할 수 있습니다. 예를 들어 "chromium-browser"대신 "chromium-browse"를 인쇄합니다.
프로세스 인수 (예 :)에 대해 일종의 패턴 인식을 시도하여 프로세스를 찾는 것은 pgrep "mysqld"
조만간 실패 할 운명의 전략입니다. 두 개의 mysqld가 실행되고 있다면 어떨까요? 그 접근법은 잊어 버리세요. 일시적으로 문제를 해결하고 1 ~ 2 년 동안 작동 할 수 있지만 생각하지 못한 일이 발생합니다.
프로세스 ID (pid) 만 진정으로 고유합니다.
백그라운드에서 무언가를 시작할 때 항상 pid를 저장하십시오. Bash에서는 Bash $!
변수를 사용하여 수행 할 수 있습니다 . 그렇게함으로써 많은 문제를 해결할 수 있습니다.
이제 질문은 pid가 실행 중인지 아는 방법이됩니다.
간단하게 :
ps -o pid = -p <pid>
이것은 POSIX이므로 이식 가능합니다. 프로세스가 실행 중이면 pid 자체를 반환하고 프로세스가 실행 중이 아니면 아무것도 반환하지 않습니다. 엄밀히 말하면이 명령은 단일 열인을 반환 pid
하지만 빈 제목 헤더 (등호 바로 앞의 항목)를 지정했기 때문에 요청 된 유일한 열이므로 ps 명령은 헤더를 전혀 사용하지 않습니다. 파싱이 더 쉬워지기 때문에 우리가 원하는 것입니다.
이것은 Linux, BSD, Solaris 등에서 작동합니다.
또 다른 전략은 위 ps
명령 의 종료 값을 테스트하는 것 입니다. 프로세스가 실행 중이면 0이고 그렇지 않으면 0이 아닙니다. POSIX 사양에 따르면 ps
오류가 발생하면> 0을 종료해야하지만 '오류'를 구성하는 것이 무엇인지 명확하지 않습니다. 따라서 모든 유닉스 / 리눅스 플랫폼에서 잘 작동 할 것이라고 확신하지만 개인적으로이 전략을 사용하지는 않습니다.
grep <sometext>
주어진 프로세스를 찾기 위해 어떤 형태를 취해야하는 상황에 처해 있다면 IMHO라는 프로세스를 시작할 때 뭔가 잘못한 것이라고 말하는 것입니다 . 나는 OP의 질문에서 실제로 그가 프로세스가 시작되는 방법을 제어 할 수 있다는 것을 취합니다.
대부분의 Linux 배포에서는 pidof
(8)을 사용할 수 있습니다 .
지정된 프로세스의 실행중인 모든 인스턴스의 프로세스 ID를 인쇄하거나 실행중인 인스턴스가 없으면 아무것도 인쇄하지 않습니다.
예를 들어, 내 시스템에서 (4 개의 인스턴스 bash
와 1 개의 remmina
실행 인스턴스가 있음 ) :
$ pidof bash remmina
6148 6147 6144 5603 21598
다른 Unices에서 pgrep
또는 ps
and 의 조합은 grep
다른 사람들이 정당하게 지적했듯이 동일한 것을 달성합니다.
pidof httpd
은 Red Hat 5에서 잘 작동하지만 내 Red Hat 4 pidof
에는 존재하지 않습니다. :-(
이것은 대부분의 Unix, BSD 및 Linux에서 작동합니다.
PATH=/usr/ucb:${PATH} ps aux | grep httpd | grep -v grep
테스트 대상 :
PATH=...
]ps
. 두 번째를 피하기 위해 grep
나는 제안한다 :ps aux | grep [h]ttpd
grep
.
가장 간단한 방법은 ps 및 grep을 사용하는 것입니다.
command="httpd"
running=`ps ax | grep -v grep | grep $command | wc -l`
if [ running -gt 0 ]; then
echo "Command is running"
else
echo "Command is not running"
fi
명령에 일부 명령 인수가있는 경우 'grep $ command'뒤에 'grep cmd_arg1'을 추가하여 관심이없는 다른 가능한 프로세스를 필터링 할 수도 있습니다.
예 : 제공된 인수가있는 Java 프로세스가있는 경우 표시 :
-Djava.util.logging.config.file = logging.properties
실행 중
ps ax | grep -v grep | grep java | grep java.util.logging.config.file=logging.properties | wc -l
ps cax
하면 grep -v
. 예를 들어 다음을 사용할 수 있습니다 ps cax | grep java > /dev/null || echo "Java not running"
..
사소한 추가 : -c
ps에 플래그를 추가하면 grep -v
나중에 grep 프로세스를 포함하는 행을 제거 할 필요가 없습니다 . 즉
ps acux | grep cron
bsd-ish 시스템에서 필요한 모든 타이핑입니다 (MacOSX 포함) -u
. 정보가 덜 필요 하면 자리를 비울 수 있습니다 .
기본 ps
명령 의 유전학이 SysV를 다시 가리키는 시스템에서는 다음을 사용합니다.
ps -e |grep cron
또는
ps -el |grep cron
pid 및 프로세스 이름 이상을 포함하는 목록의 경우. 물론 -o <field,field,...>
옵션을 사용하여 인쇄 할 특정 필드를 선택할 수 있습니다.
다양한 제안을 종합 해보면, (단어의 일부를 트리거하는 신뢰할 수없는 grep없이) 생각 해낼 수 있었던 가장 깨끗한 버전은 다음과 같습니다.
kill -0 $(pidof mysql) 2> /dev/null || echo "Mysql ain't runnin' message/actions"
kill -0은 프로세스를 종료하지 않지만 존재하는지 확인한 다음 true를 반환합니다. 시스템에 pidof가 없으면 프로세스를 시작할 때 pid를 저장합니다.
$ mysql &
$ echo $! > pid_stored
그런 다음 스크립트에서 :
kill -0 $(cat pid_stored) 2> /dev/null || echo "Mysql ain't runnin' message/actions"
실행하면 PID가 $!
변수에 기록됩니다 . 이 PID를 파일에 저장하십시오.
그런 다음이 PID가 실행중인 프로세스에 해당하는지 확인해야합니다. 다음은 완전한 스켈레톤 스크립트입니다.
FILE="/tmp/myapp.pid"
if [ -f $FILE ];
then
PID=$(cat $FILE)
else
PID=1
fi
ps -o pid= -p $PID
if [ $? -eq 0 ]; then
echo "Process already running."
else
echo "Starting process."
run_my_app &
echo $! > $FILE
fi
의 답변 을 기반으로합니다 peterh
. 주어진 PID가 실행 중인지 아는 트릭은 ps -o pid= -p $PID
명령어에 있습니다.
이 접근법은 'ps', 'pidof'및 rest 명령을 사용할 수없는 경우에 사용할 수 있습니다. 저는 개인적으로 도구 / 스크립트 / 프로그램에서 procfs를 매우 자주 사용합니다.
egrep -m1 "mysqld$|httpd$" /proc/[0-9]*/status | cut -d'/' -f3
무슨 일이 일어나고 있는지 약간의 설명 :
이것은 기본 이름이 "chromium-browser"인 프로세스 수를 인쇄합니다.
ps -e -o args= | awk 'BEGIN{c=0}{
if(!match($1,/^\[.*\]$/)){sub(".*/","",$1)} # Do not strip process names enclosed by square brackets.
if($1==cmd){c++}
}END{print c}' cmd="chromium-browser"
"0"이 인쇄되면 프로세스가 실행되고 있지 않습니다. 이 명령은 프로세스 경로에 구분 공백이 없다고 가정합니다. 일시 중단 된 프로세스 나 좀비 프로세스로 이것을 테스트하지 않았습니다.
Linux gwak
에서 awk
대안으로 사용하여 테스트했습니다 .
다음은 몇 가지 예제 사용과 함께 더 다양한 솔루션입니다.
#!/bin/sh
isProcessRunning() {
if [ "${1-}" = "-q" ]; then
local quiet=1;
shift
else
local quiet=0;
fi
ps -e -o pid,args= | awk 'BEGIN{status=1}{
name=$2
if(name !~ /^\[.*\]$/){sub(".*/","",name)} # strip dirname, if process name is not enclosed by square brackets.
if(name==cmd){status=0; if(q){exit}else{print $0}}
}END{exit status}' cmd="$1" q=$quiet
}
process='chromium-browser'
printf "Process \"${process}\" is "
if isProcessRunning -q "$process"
then printf "running.\n"
else printf "not running.\n"; fi
printf "Listing of matching processes (PID and process name with command line arguments):\n"
isProcessRunning "$process"
여기 내 버전입니다. 풍모:
스크립트:
#!/bin/bash
# $1 - cmd
# $2 - args
# return: 0 - no error, running; 1 - error, not running
function isRunning() {
for i in $(pidof $1); do
cat /proc/$i/cmdline | tr '\000' ' ' | grep -F -e "$2" 1>&2> /dev/null
if [ $? -eq 0 ]; then
return 0
fi
done
return 1
}
isRunning java "-Djava.util.logging.config.file=logging.properties"
if [ $? -ne 0 ]; then
echo "not running, starting..."
fi
POSIX 표준 명령 및 옵션만을 기반으로하는 다음 셸 기능은 대부분의 Unix 및 Linux 시스템에서 작동합니다. :
isPidRunning() {
cmd=`
PATH=\`getconf PATH\` export PATH
ps -e -o pid= -o comm= |
awk '$2 ~ "^.*/'"$1"'$" || $2 ~ "^'"$1"'$" {print $1,$2}'
`
[ -n "$cmd" ] &&
printf "%s is running\n%s\n\n" "$1" "$cmd" ||
printf "%s is not running\n\n" $1
[ -n "$cmd" ]
}
$ isPidRunning httpd
httpd is running
586 /usr/apache/bin/httpd
588 /usr/apache/bin/httpd
$ isPidRunning ksh
ksh is running
5230 ksh
$ isPidRunning bash
bash is not running
모호한 "0]"명령 이름이 전달되면 질식하고 이름에 공백이 포함 된 프로세스를 식별하지 못합니다.
가장 많이 찬성되고 수용된 솔루션은 이식성이없는 ps
옵션을 필요로 하며 인기에도 불구하고 모든 Unix / Linux 시스템에 존재한다고 보장 할 수없는 셸을 무상으로 사용합니다 ( bash
).
$ isPidRunning 0]
예를 들어 "0]이 실행 중입니다. 3 [ksoftirqd / 0] 8 [rcuop / 0] 17 [rcuos / 0] 26 [rcuob / 0] 34 [migration / 0] 35 [watchdog / 0]"여기에서.