このコマンドでプロセス名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
実行時にsystemctl
、stop
およびパラメータが渡された現在実行中のプロセスのpidが欲しいとします。Myservice
Linuxでは、メソッドは次のとおりです。
stat()
ファイルでaを実行し、合計が返されたものと同じであることを/proc/*/exe
確認します(プロセスが実行されてから更新されなかったと仮定)。st_dev
st_ino
stat("/usr/bin/systemctl")
systemd
systemctl
- 次に、
/proc/<pid>/cmdline
そのプロセスのファイルが含まれていることを確認してくださいsystemctl<NUL>stop<NUL>Myservice<NUL>
。プロセスはファイルを任意に変更できますが、通常は変更しないことに注意してください。
特に、C/C++ プログラムでなぜこのようなことをするのか理解できません。これは次のとおりですXYの問題。