正確な名前を持つプロセスの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"

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

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

答え2

Linuxでは、プロセス名プロセス名を指定するために使用される0〜15バイトのシーケンス。プロセス名は、コマンドが実行されるたびに実行または使用されるファイルのデフォルト名の最初の15バイトまで変更されますpctrl(PR_SET_NAME)

systemctl stop Myserviceこれは、プロセスまたはその祖先のいずれかによって実行されたときに3つの引数に渡されたスペースを連結するのと似ています。/usr/bin/systemctl

/usr/bin/systemctl実行時にsystemctlstopおよびパラメータが渡された現在実行中のプロセスのpidが欲しいとします。MyserviceLinuxでは、メソッドは次のとおりです。

  • stat()ファイルでaを実行し、合計が返されたものと同じであることを/proc/*/exe確認します(プロセスが実行されてから更新されなかったと仮定)。st_devst_inostat("/usr/bin/systemctl")systemdsystemctl
  • 次に、/proc/<pid>/cmdlineそのプロセスのファイルが含まれていることを確認してくださいsystemctl<NUL>stop<NUL>Myservice<NUL>。プロセスはファイルを任意に変更できますが、通常は変更しないことに注意してください。

特に、C/C++ プログラムでなぜこのようなことをするのか理解できません。これは次のとおりですXYの問題

関連情報