실행 중인 프로세스를 종료하는 이와 같은 makefile이 있습니다.
test: client server
pgrep myserver && killall myserver
/build/bin/myserver --background
/build/bin/myclient --server 127.0.0.1
미리 시작했더 라면 myserver
효과가 있었을 텐데. 그렇지 않은 경우 pgrep myserver
0이 아닌 상태로 실패하고 Makefile은 이를 오류로 처리합니다.
pgrep myserver && killall myserver
make: *** [test] Error 1
어떤 제안이 있으십니까?
답변1
killall
와 결합 하지 마십시오 pgrep
. 동일한 일치 규칙을 사용하지 않으므로 pgrep
표시되는 내용이 killall
치명적이지 않을 수 있습니다. 를 사용하는 것은 PID를 표시하는 대신 일치하는 프로세스를 종료한다는 점을 제외하면 pkill
완전히 동일합니다 . 과 가 동시에 호출 pgrep
되면 경쟁 조건이 발생합니다. 런타임 시 표시된 프로세스 중 일부가 종료되고 일부 새 프로세스가 시작될 수 있습니다. 프로세스 ID에 신경 쓰지 않는 한 호출하는 것은 의미가 없습니다. 직접 전화하실 수 있습니다 .pgrep
pkill
pkill
pgrep
pgrep
pkill
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