正確な名前を持つプロセスのPIDを取得するには?

正確な名前を持つプロセスのPIDを取得するには?

このコマンドでプロセス名systemctl stop MyserviceのIDを取得しようとしましたが、正確なpidは取得できませんでした。

   if(0 == system("pidof -x systemctl stop Myservice  > /dev/null")) {
  //A process is running.
   }

このコードは、systemctl start Myserviceのpidを提供します。システムで実行している場合は、「systemctl stop Myservice」というプロセス名の特定のpidのみを取得する必要がありますか?

ベストアンサー1

あなたのシステムで利用可能な場合はpgrepここに適しているようです。

pgrep -xf "systemctl stop Myservice"

pgrep同じパッケージで提供されますps(少なくとも私が言及したCentOS 7システムでは)

$ rpm -q --whatprovides $(which pgrep)
procps-ng-3.3.10-28.el7.x86_64
$ rpm -q --whatprovides $(which ps)
procps-ng-3.3.10-28.el7.x86_64

BusyBoxを使用した軽量展開図〜らしい狭いテストに合格しても大丈夫です。

$ docker run --rm alpine pgrep --help
BusyBox v1.35.0 (2022-05-09 17:27:12 UTC) multi-call binary.

Usage: pgrep [-flanovx] [-s SID|-P PPID|PATTERN]
[...]

したがって、コードがコンテナ内で実行されると、状況はそれほど確実ではないかもしれませんが(実行しようとしている作業を考えると、その可能性は低いようですが)にps頼ることができると思います。pgrep

systemctl stop ...実行中のコマンドをキャプチャしますか?これは競合状態やパフォーマンスの問題が発生しやすいようです。 Cプログラムが遅すぎて繰り返し実行されている命令を見逃したり、速すぎてCPUを消費しすぎる場合はどうなりますか?

サービスが状態から離れている時点を検出することが目標である場合、次のアプローチがactiveより良い可能性があります。

systemctl status Myservice | grep -qE "^ +Active: active"

サービスがアクティブでない場合は、ゼロ以外の終了コードを返す必要があります。

ユースケースに応じて、いくつかの追加のロジックを使用して、非アクティブ状態が表示されるたびに表示されるのではなく、状態が変更されたときにのみ表示できます。

おすすめ記事