Makefile: 실행 중인 프로세스 종료

Makefile: 실행 중인 프로세스 종료

실행 중인 프로세스를 종료하는 이와 같은 makefile이 있습니다.

test: client server
    pgrep myserver && killall myserver
    /build/bin/myserver --background
    /build/bin/myclient --server 127.0.0.1

미리 시작했더 라면 myserver효과가 있었을 텐데. 그렇지 않은 경우 pgrep myserver0이 아닌 상태로 실패하고 Makefile은 이를 오류로 처리합니다.

pgrep myserver && killall myserver
make: *** [test] Error 1

어떤 제안이 있으십니까?

답변1

killall와 결합 하지 마십시오 pgrep. 동일한 일치 규칙을 사용하지 않으므로 pgrep표시되는 내용이 killall치명적이지 않을 수 있습니다. 를 사용하는 것은 PID를 표시하는 대신 일치하는 프로세스를 종료한다는 점을 제외하면 pkill완전히 동일합니다 . 과 가 동시에 호출 pgrep되면 경쟁 조건이 발생합니다. 런타임 시 표시된 프로세스 중 일부가 종료되고 일부 새 프로세스가 시작될 수 있습니다. 프로세스 ID에 신경 쓰지 않는 한 호출하는 것은 의미가 없습니다. 직접 전화하실 수 있습니다 .pgreppkillpkillpgreppgreppkill

pkill종료할 프로세스가 발견되지 않으면 상태 1이 반환됩니다. -make가 이 오류를 무시하도록 지시하는 명령의 시작 부분에 추가하거나, 똑같은 pkill myserver || true작업을 수행 pkill myserver하되 항상 성공 상태를 반환하도록 명령을 변경하십시오.

test: client server
    pkill myserver || true
    /build/bin/myserver --background
    /build/bin/myclient --server 127.0.0.1

답변2

||true첫 번째 명령이 항상 성공을 반환하는지 확인 해야 합니다 .

pgrep예를 들어 stderr을 삭제하면 이러한 필요성을 피할 수 있습니다.

test: client server
  killall myserver 2>/dev/null || true
  myserver --background
  myclient --server 127.0.0.1

답변3

명령 결과를 무시해야 하는 경우만들다-, 다음과 같이 연산자를 사용해야 합니다 .

test: client server
    -pkill -f myserver
    myserver --background
    myclient --server 127.0.0.1

이 방법만들다pkill실패하더라도 상관하지 않고 불필요한 것을 사용할 필요가 없다는 것을 알게 될 것입니다 ||.

다음과 같이 명령 및 출력을 인쇄하지 않을 수도 있습니다 @-.

test: client server
    @-pkill -f myserver
    myserver --background
    myclient --server 127.0.0.1

관련 정보