見出し画像

Windowsにおいて特定のサービス/プロセスが停止していたら関連サービス/プロセスも停止するバッチ

前回はサービスを自動起動させるものだった。けど、困ったことはそれだけじゃない。勝手に強制停止された場合、関連のサービスまたはプロセスが残ってしまう時がある。むしろそれが原因で、サービスの再起動を邪魔してくれる時がある。今回はそれを解消するバッチを作る。
以下は前回。

サービスを停止させる

二つのサービス停止のパターンがある

サービスを単純に停止させるには下記コマンドが使える

sc stop "サービス名"

上記の場合、サービスの停止の命令をするだけできちんと停止するか否かの判定はしない。もし、きちんと判定する場合は以下を使う。

net stop "サービス名"

どうやって使い分ける?

sc stopの場合は
サービスの停止をチェックしたら関連サービスも落とすようにフォローする場合に使えばよいだろう。

net stopの場合は
サービスの停止をチェックし、停止していたら関連サービスを停止し、その上でサービスを起動させる場合に使えばよいだろう。
この場合にsc stopを使ってしまうと停止中にサービス起動が走ってしまうことが懸念される。

実際のバッチを作ると

sc stopの場合
※Aサービスが停止していたら、Bサービスも停止させるバッチ

rem サービスが停止されているかチェック
sc query state=inactive |findstr "Aサービス"
if %ERRORLEVEL%==0 (
rem 停止されている場合関連サービスも停止する。
 sc stop "Bサービス"
)
exit

net stopの場合
※Aサービスが停止していたら、Bサービスも停止して、改めてAサービスを起動させるバッチ

rem サービスが停止されているかチェック
sc query state=inactive |findstr "Aサービス"
if %ERRORLEVEL%==0 (
rem 停止されている場合関連サービスも停止する。
 net stop "Bサービス"
 net start "Aサービス"
)
exit

プロセスを停止させる

プロセスの起動自体は、実行ファイルを起動させればいい。けど、停止したい場合はどうしたら良いんだろう。

止めるコマンド

以下のコマンドで停止させる。

taskkill /im "実行ファイル名"

上記でも停止されない場合がある。その場合は以下で強制終了になる。

taskkill /im "実行ファイル名" /f

止めたいプロセスの実行ファイル名の調べ方

タスクリストにある名前と実行ファイル名が違う場合がある。
それを調べるためには止めたいプロセスを右クリックし、「プロパティ」で調べられる。

実際のバッチを作ると

Aプロセスが停止していたら、関連プロセスのBプロセスを強制停止させる。

rem プロセスが停止されているかチェック
tasklist | find "Aプロセス"
if %ERRORLEVEL%==1 (
rem 停止されている場合関連プロセスを強制終了する。
taskkill /im "Bプロセス" /f
)
exit

関連プロセスが起動しているかの判定を加えてもいいかもしれない。

rem プロセスが停止されているかチェック
tasklist | find "Aプロセス"
if %ERRORLEVEL%==1 (
 rem さらに関連プロセスが起動しているかチェックする
 tasklist | find "Bプロセス"
 if %ERRORLEVEL%==0 (
  taskkill /im "Bプロセス" /f
 )
)
exit

終わりに

昔はnet start /stop ばっかりで作っていたので、前回はsc start/stopを使うことにした。そもそもその違いってどういう時に使うのだろうと調べてみて、そのシチュエーションを今回考えてみた。
また、プロセスについてはそもそも前回停止を考慮していなかったため、今回調べてみた。

おそらくどこかで困っている人がいると思うので、助かれば幸いです。

今回は以上

その他のバッチファイルの記事は以下


この記事が気に入ったらサポートをしてみませんか?