[linux] 프로세스가 실행 중인지 확인하는 Linux / Unix 명령?
특정 프로세스가 실행 중인지 확인하는 플랫폼 독립적 (Linux / Unix | OSX) 셸 / bash 명령이 필요합니다. 예 mysqld
, httpd
…이 작업을 수행하는 가장 간단한 방법 / 명령은 무엇입니까?
답변
동안 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
가능한 경우 전체 경로를 확인 하는 데 사용 하는 것이 좋습니다 .
참조 :
http://linux.about.com/od/commands/l/blcmdl1_ps.htm
답변
PID를 알아야합니다!
프로세스 인수 (예 :)에 대해 일종의 패턴 인식을 시도하여 프로세스를 찾는 것은 pgrep "mysqld"
조만간 실패 할 운명의 전략입니다. 두 개의 mysqld가 실행되고 있다면 어떨까요? 그 접근법은 잊어 버리세요. 일시적으로 문제를 해결하고 1 ~ 2 년 동안 작동 할 수 있지만 생각하지 못한 일이 발생합니다.
프로세스 ID (pid) 만 진정으로 고유합니다.
백그라운드에서 무언가를 시작할 때 항상 pid를 저장하십시오. Bash에서는 Bash $!
변수를 사용하여 수행 할 수 있습니다 . 그렇게함으로써 많은 문제를 해결할 수 있습니다.
프로세스가 실행 중인지 확인하는 방법 (pid로)
이제 질문은 pid가 실행 중인지 아는 방법이됩니다.
간단하게 :
ps -o pid = -p <pid>
이것은 POSIX이므로 이식 가능합니다. 프로세스가 실행 중이면 pid 자체를 반환하고 프로세스가 실행 중이 아니면 아무것도 반환하지 않습니다. 엄밀히 말하면이 명령은 단일 열인을 반환 pid
하지만 빈 제목 헤더 (등호 바로 앞의 항목)를 지정했기 때문에 요청 된 유일한 열이므로 ps 명령은 헤더를 전혀 사용하지 않습니다. 파싱이 더 쉬워지기 때문에 우리가 원하는 것입니다.
이것은 Linux, BSD, Solaris 등에서 작동합니다.
또 다른 전략은 위 ps
명령 의 종료 값을 테스트하는 것 입니다. 프로세스가 실행 중이면 0이고 그렇지 않으면 0이 아닙니다. POSIX 사양에 따르면 ps
오류가 발생하면> 0을 종료해야하지만 ‘오류’를 구성하는 것이 무엇인지 명확하지 않습니다. 따라서 모든 유닉스 / 리눅스 플랫폼에서 잘 작동 할 것이라고 확신하지만 개인적으로이 전략을 사용하지는 않습니다.
답변
대부분의 Linux 배포에서는 pidof
(8)을 사용할 수 있습니다 .
지정된 프로세스의 실행중인 모든 인스턴스의 프로세스 ID를 인쇄하거나 실행중인 인스턴스가 없으면 아무것도 인쇄하지 않습니다.
예를 들어, 내 시스템에서 (4 개의 인스턴스 bash
와 1 개의 remmina
실행 인스턴스가 있음 ) :
$ pidof bash remmina
6148 6147 6144 5603 21598
다른 Unices에서 pgrep
또는 ps
and 의 조합은 grep
다른 사람들이 정당하게 지적했듯이 동일한 것을 달성합니다.
답변
이것은 대부분의 Unix, BSD 및 Linux에서 작동합니다.
PATH=/usr/ucb:${PATH} ps aux | grep httpd | grep -v grep
테스트 대상 :
- SunOS 5.10 [따라서
PATH=...
] - Linux 2.6.32 (CentOS)
- Linux 3.0.0 (Ubuntu)
- 다윈 11.2.0
- FreeBSD 9.0- 안정
- Red Hat Enterprise Linux ES 릴리스 4
- Red Hat Enterprise Linux Server 릴리스 5
답변
가장 간단한 방법은 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
답변
사소한 추가 : -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"
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)