iT邦幫忙

1

判斷服務有沒有啟動 ,若沒有則啟動服務

自己寫了一個服務叫做 Service1
因為有時候服務會自己突然停掉,想寫個批次檔可以判斷服務有沒啟動,如果沒有就啟動服務
我的code如下

for /f "delims=: tokens=2" %a in ('sc query ^| find "Service1"') do set _MYserver=%a

if not (%_MYserver%=="Service1") (net start Service1)

不過執行起來有問題...請問我哪邊寫錯需要調整的?


感謝各位前輩協助..我也覺得應該是要查為何服務會跳掉..
不過我有點不太理解是這支程式很簡單,而且之前run一段時間都沒問題..不知道為啥現在會一直跳掉...看LOG是 IO錯誤 還在努力尋找中/images/emoticon/emoticon06.gif
服務的部分code:

    Protected Overrides Sub OnStart(ByVal args() As String)
        ' 在此加入啟動服務的程式碼,這個方法必須設定已啟動的
        ' 事項,否則可能導致服務無法工作。
        FileSystemWatcher2.Path = "D:\RD\SWAPD00\TEST\OPENFILE\"
        FileSystemWatcher2.IncludeSubdirectories = True
        FileSystemWatcher2.Filter = "*.*"
        FileSystemWatcher2.EnableRaisingEvents = True

    End Sub
    
        Private Sub FileSystemWatcher2_Create(sender As Object, e As FileSystemEventArgs) Handles FileSystemWatcher2.Created
        Shell("cmd.exe /c C:\FLOG\產生共用檔案使用表.lnk", vbNormalFocus)
    End Sub

好像有找到原因了 我會定時執行一個批次 我發現執行後服務會停止,阿不過手動執行又不會....../images/emoticon/emoticon06.gif

確定是執行這個批次檔導致服務停止,但單獨執行又不會錯誤,目前先將此service設定重複啟動/images/emoticon/emoticon70.gif/images/emoticon/emoticon70.gif/images/emoticon/emoticon70.gif/images/emoticon/emoticon70.gif

看更多先前的討論...收起先前的討論...
ccutmis iT邦高手 8 級 ‧ 2019-09-04 09:25:22 檢舉
這個討論跟你要的東西蠻類似的 不過是用powershell 參考看看
https://stackoverflow.com/questions/35064964/powershell-script-to-check-if-service-is-started-if-not-then-start-it
harrytsai iT邦新手 4 級 ‧ 2019-09-04 09:31:01 檢舉
這要看如何判斷服務停止,因為如果每次都是這樣的機制,你會找不到真正問題點
slime iT邦大師 1 級 ‧ 2019-09-04 09:34:08 檢舉
(如果程式是自己寫的, 建議參考其他網友建議, 或自己產生 log 紀錄來檢查 Service 停止的情況.
以下批次檔是因為要檢查的程式非我開發與維護, 所以才用批次檔檢查. )

個人習慣簡單一點的方式:
for %f in ( Service1.exe ) do (( tasklist | find /i "%f" ) || net start %f )

1. tasklist 列出目前執行中的程式.
2. 用 | (pipeline) 把 tasklist 執行結果往下一個程式丟.
3. 用 find 比對文字, 找一下有沒有預定要找的程式. 留意如果要忽視大小寫, 要用 find /i
4. 批次檔的 || 是如果前一個步驟 return FALSE 時才執行.
5. for %f in ( Service1.exe ) do 只是個人習慣, 非必要, 因為要比對的程式如果比較多, 只要改前面就好, 後面不用動.
froce iT邦大師 1 級 ‧ 2019-09-04 09:39:10 檢舉
在你的service加log,去看為啥你的service會死掉。
另外,windows service可以設定自己重新起動,在service的修復頁面可以設定。
石頭 iT邦新手 2 級 ‧ 2019-09-04 10:58:25 檢舉
重新啟動好像也是個好方式,感謝提醒,來去試試看。
froce iT邦大師 1 級 ‧ 2019-09-04 14:06:05 檢舉
> 好像有找到原因了 我會定時執行一個批次 我發現執行後服務會停止,阿不過手動執行又不會..

去檢查你工作排程器的設定,有時候他的環境變數、執行者跟你手動執行時不一樣。

1 個回答

3
dragonH
iT邦超人 5 級 ‧ 2019-09-04 09:40:46
最佳解答
@echo off
for /f "delims=: tokens=2" %%a in ('sc query ^| find "Service1"') do set _MYserver=%%a
if not ("%_MYserver%"=="Service1") (net start Service1)

這樣?

☟這個感覺比較好☟

@echo off
for /F "tokens=3 delims=: " %%H in ('sc query "Service1" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   net start Service1
  )
)

參考

石頭 iT邦新手 2 級 ‧ 2019-09-04 13:55:25 檢舉

感謝回答~~ 不過依我目前情況設定重複執行就可以了。

我要發表回答

立即登入回答