実行中のプロセスを終了するこのような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を気にしない限り、呼び出すことは意味がありません。直接電話することができます。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