このコマンドでプロセス名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"
サービスがアクティブでない場合は、ゼロ以外の終了コードを返す必要があります。
ユースケースに応じて、いくつかの追加のロジックを使用して、非アクティブ状態が表示されるたびに表示されるのではなく、状態が変更されたときにのみ表示できます。