サービス関連記事
やりたいこと
下記で、C++とC#で、Windowsのサービスを作成した。
C++
https://qiita.com/tera1707/items/8f4246a5666a01134b59
C#
https://qiita.com/tera1707/items/47335420a1a91e2eaa4a
サービスは、ビルドしてexeが出来上がっても、そのままVisualStdio2019でF5を押して実行、とかはできない。
いったんサービスとしてPCにインストールして、そのサービスを「開始」したうえで、VisualStudioから「アタッチ」しないといけない。
そのインストールなどなどをするときに、scコマンドを使うのだが、速攻で忘れてしまいそうなので、使いそうなコマンドを下記に全部まとめておきたい。
使えそうなコマンドを一個にまとめたbat
@echo off
set SERVICENAME="SvcName"
set SERVICEDISPNAME=%SERVICENAME%
set BINPATH=C:\Users\username\Desktop\test\serviceJikken1\Debug\serviceJikken1.exe
set DISCRIPTION="Svc Description..."
rem サービスのプロセスを無理やり終了させる
taskkill /f /im %BINPATH%
rem サービスをアンインストール
sc delete %SERVICENAME%
pause
rem サービスをインストール
rem 試した限り、binPathにはフルパスを指定しないとうまくいかない
sc create %SERVICENAME% start=auto binPath= %BINPATH% DisplayName= %SERVICEDISPNAME%
pause
rem 説明文を編集
sc description %SERVICENAME% %DISCRIPTION%
pause
rem サービスをスタート
rem sc start %SERVICENAME%
net start %SERVICENAME%
pause
rem サービスをストップ
sc stop %SERVICENAME%
pause
コードをビルドしなおして、そいつでサービスを作り直してサービススタート
サービスを作っている最中に、コードをちょっと直したときに、いったんサービスをstopして、ビルドしなおして、サービス作り直して再度スタートさせて、、、とやっていると非常にめんどくさいので、下記のようなbatを作って簡単にビルド→サービス再起動までできるようにしておけば便利かもしれない。
@echo off
set SOLUTIONPATH="C:\Users\username\Desktop\test\serviceJikken1\serviceJikken1.sln"
set SERVICENAME="SvcName"
set SERVICEDISPNAME=%SERVICENAME%
set BINPATH=C:\Users\username\Desktop\test\serviceJikken1\Debug\serviceJikken1.exe
set DISCRIPTION="Svc Description..."
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat"
echo -サービスのプロセスを無理やり終了させる
taskkill /f /im %BINPATH%
echo -サービスをアンインストール
sc delete %SERVICENAME%
echo -ソリューションをリビルドする
MSBuild %SOLUTIONPATH% /t:clean;rebuild /p:Configuration=Debug;Platform="x86" > nul
if %ERRORLEVEL% neq 0 (
echo ErrorLevel:%ERRORLEVEL%
echo ビルド失敗
pause
exit
)
echo -サービスをインストール
rem 試した限り、binPathにはフルパスを指定しないとうまくいかない
sc create %SERVICENAME% start=auto binPath= %BINPATH% DisplayName= %SERVICEDISPNAME%
echo -説明文を編集
sc description %SERVICENAME% %DISCRIPTION%
echo -サービスをスタート
rem sc start %SERVICENAME%
net start %SERVICENAME%
pause
プロセス名からサービス名を調べる
コマンドではないが、下記のようにすると、プロセス名だけわかっているときに、そのプロセスが何のサービスとして動いているかを調べることができる。
例:私のPCで動いている「MicronCacheMonitor.exe」は何のサービスか調べる
タスクマネージャーを開いて、「詳細」タブで、そのプロセス名を見つける。
そいつを右クリックして、「サービスの表示」を押す。
そうすると、同じタスクマネージャーの「サービス」タブで、そのサービスの名前が表示される。
scコマンドに渡すサービス名は、ここに出てるサービス名を指定してやればOK。
もしサービスの「表示名」が知りたければ、sc GetDisplayName サービス名
で取れる。
コマンド
sc GetDisplayName MicronCacheMonitor
結果
C:\Users\masa>sc GetDisplayName MicronCacheMonitor
[SC] GetServiceDisplayName SUCCESS
名前 = Micron SSD Cache Monitor
参考
scコマンド