프로세스가 아직 실행되고 있지 않은 경우(백그라운드에서) 특정 명령만 실행하는 bash 명령줄을 만들 수 있나요?
*command가 이미 실행 중인지 확인하는 방법은 무엇입니까?
(그래서 그 사이에 다음 명령을 추가하여 &&
첫 번째 명령이 true인 경우에만 다음 명령이 실행되도록 할 수 있습니다.)
*: 테스트하다, 결정하다, 발견하다, 발견하다
답변1
답변2
나는 때때로 다음과 같은 기술을 사용합니다.
$ pgrep <process name> || <process name>
이전에는 pgrep
다음과 같이 수행되었습니다.
$ ps -eaf | grep -q <[p]rocess name> || <process name>
예
비트가 제자리에 있으면 [p]
당신은 grep
그것에서 벗어날 수 없을 것입니다.
$ ps -eaf | grep -q [s]leep || sleep 10
답변3
동일한 프로세스의 여러 인스턴스가 독립적으로 실행될 수 있기 때문에 이는 까다로울 수 있습니다. 예를 들어, 다른 포트에서 수신 대기하는 서버 또는 다른 사용자로 실행되는 서비스입니다. 이러한 인스턴스를 구별하려면 각 인스턴스에 고유한 라벨을 할당해야 합니다. 태그는 일반적으로 파일이지만 추상 네임스페이스의 로컬 소켓, TCP 포트 등일 수 있습니다. 모든 고유 식별자가 가능합니다. 태그가 파일인 경우 프로세스 ID(pidfile)를 포함하는 일반 파일이거나 파일이 수신 대기 중인 명명된 파이프 또는 소켓 등일 수 있습니다. 이상적으로 태그는 클라이언트가 해당 프로세스에 연결할 수 있도록 하는 통신 끝점입니다.
각 유형의 태그는 찾고 있는 인스턴스가 실행 중인지 확인하기 위해 다르게 확인합니다. 예를 들어 로컬 파일 소켓을 사용하여 연결을 시도하고 소켓에서 수신 대기 중인 프로세스가 없으면 프로세스를 시작합니다. 태그가 pidfile인 경우 해당 프로세스 ID를 가진 프로세스가 존재하는지 확인하세요. 하지만 프로세스가 종료되면 해당 ID를 재사용하는 관련 없는 프로세스가 있을 수 있으므로 이는 취약하다는 점에 유의하세요. 두 클라이언트가 짧은 시간 내에 프로세스에 액세스하려고 하면 둘 다 프로세스가 존재하지 않는다는 사실을 발견하고 시작하려고 할 수 있습니다. 이러한 경합 상태를 올바르게 방지하는 것은 까다로울 수 있습니다.
동일한 감독자 프로세스에 의해 인스턴스가 모두 시작되면 인스턴스 관리가 더 쉬워지며, 감독자 프로세스는 인스턴스가 종료되는 시점을 감지하고 그에 따라 대응합니다.다양한 서비스 모니터링 프로그램이것은 가능합니다.
프로그램이 알려진 통신 엔드포인트에서 응답하지 않고 하이퍼바이저에 의해 관리되지 않는 경우 가난한 사람의 레이블은 pidfile, 즉 프로세스 ID가 포함된 파일입니다. 프로세스가 시작되면 pid가 미리 지정된 이름으로 파일에 기록됩니다. 존재하는 프로세스가 필요한 경우 pid 파일을 읽고 해당 pid를 가진 프로세스가 존재하는지 확인하십시오. 프로세스를 종료하면 pidfile을 삭제하십시오. 감독되지 않는 pidfile의 가장 두드러진 문제는 프로세스가 종료되면 관련 없는 일부 프로세스에서 해당 pid를 재사용할 수 있다는 것입니다. 최소한 프로세스 이름이나 프로세스 실행 파일을 확인하여 올바른 프로세스와 통신하고 있는지 확인해야 합니다. 많은 UNIX 변종에는정규식명령: pgrep SOMENAME
이름에 SOMENAME이 하위 문자열로 포함된 프로세스를 나열하고, 특정 사용자로 제한하고, 정확한 일치를 요구하고, "프로세스 이름"의 몇 가지 가능한 개념 중 어떤 개념을 사용할지 변경하는 등의 추가 옵션을 제공합니다.
답변4
다른 옵션:
pgrep -xq processname
- GNU/Linux에서는 처음 15자만 일치합니다.
- OS X의 조상은 포함되지 않습니다.
ps -eo comm= | sed 's|.*/||' | grep -xq processname
- GNU/Linux에서는 처음 15자만 일치합니다.
sed 's|.*/||'
OS X에서 디렉토리 이름 부분 제거
GNU/Linux에서는 명령 이름 이 ps -o comm
15자로 잘리고 처음 15자만 일치합니다.pgrep
ps -C
ps -C
OS X에서는 지원되지 않습니다(명령 이름 일치).
ps -o comm
명령의 절대 경로와 OS X의 ps -co comm
명령 이름만 인쇄합니다. GNU에서는 ps -o comm
명령 이름만 인쇄되며 -c
다른 의미를 갖습니다.
OS X의 pgrep은 이를 포함하지 않습니다 -a
. GNU의 pgrep은 기본적으로 이를 포함하지만 지원하지 않습니다 -a
.
grep -x
암시 되지 pgrep -x
않으므로 프로세스 이름에 정규식 문자가 포함될 수 있는 경우에 사용됩니다 -F
.-Fx