Makefile: 実行中のプロセスの終了

Makefile: 実行中のプロセスの終了

実行中のプロセスを終了するこのようなmakefileがあります。

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

あらかじめ始めたらmyserver効果があったはずなのに。そうでなければ、pgrep myserverゼロ以外の状態で失敗し、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

関連情報