首页
/
每日頭條
/
生活
/
bat怎麼寫腳本
bat怎麼寫腳本
更新时间:2024-05-04 04:11:18
概述

最近在Windows上搭建了個PHP MySQL nginx的開發環境,但是發現除了mysql可以注冊成服務啟動外,PHP和Nginx都無法注冊成為服務,這樣一來管理管理進程的啟動和關閉就成了一件麻煩的事情,于是就想着寫一個腳本來管理PHP和Nginx進程的啟動和關閉,首先這個腳本接收兩個參數:服務名和指令,用于指定管理的進程名稱,可以對進程進行啟動、關閉、重啟等操作

通過腳本啟動進程

在批處理腳本中可以通過 start 命令來啟動一個進程,下面以啟動nginx為例,新建一個腳本文件 PhpTools.bat ,并寫入如下内容

:: 關閉命令顯示 @echo off :: 需要确認已經将nginx進程加入到系統環境變量中,否則會出現找不到進程的錯誤,如果不想加入到環境變量,則可以指定完整的程序路徑如:start /b nginx.exe :: /b 參數指定以後台進程方式來運行程序 start /b nginx

嘗試運行腳本查看結果,得到了一個錯誤,從錯誤信息中可以看出似乎是找不到配置文件的問題

bat怎麼寫腳本(編寫BAT腳本管理進程)1

通過排查發現,nginx在運行時默認以當前執行進程的目錄為運行時目錄,但是因為當前目錄中并沒有運行時所需要的必要文件環境,所以出現了上面的錯誤,在nginx中可以通過 ​-p​ 參數來指定運行時的主目錄

編輯腳本文件,指定nginx運行時的主目錄

:: 關閉命令顯示 @echo off ... - start /b nginx start /b nginx -p D:\Apps\Nginx-1.21.1

再次執行腳本,可以看到這次沒有出現錯誤了,并且在任務管理器中也能查看到對應的進程

bat怎麼寫腳本(編寫BAT腳本管理進程)2

bat怎麼寫腳本(編寫BAT腳本管理進程)3

通過taskkill命令關閉進程

在上一步中,已經可以成功啟動進程了,接下來就是如何關閉進程了,在批處理腳本中可以通過 ​taskkill 命令來殺死進程,我們可以通過這個命令來達到關閉進程的效果

:: 關閉命令顯示 @echo off - :: 需要确認已經将nginx進程加入到系統環境變量中,否則會出現找不到進程的錯誤,如果不想加入到環境變量,則可以指定完整的程序路徑如:start /b nginx.exe - :: /b 參數指定以後台進程方式來運行程序 - start /b nginx -p D:\Apps\Nginx-1.21.1 :: 殺死進程 :: /f 強制終止指定進程 :: /t 終止指定的進程和由它啟動的子進程 :: /im 指定要終止的進程的映像名稱。通配符 '*'可用來指定所有任務或映像名稱。 taskkill /f /t /im nginx

嘗試執行腳本查看結果,得到了如下錯誤,這是因為在taskkill中必須指定完整的程序名稱其中的 ​.exe​ 也是不能忽略的

bat怎麼寫腳本(編寫BAT腳本管理進程)4

編輯腳本文件,加入完整的進程名稱

:: 關閉命令顯示 @echo off ... - taskkill /f /t /im nginx taskkill /f /t /im nginx.exe

再次執行腳本,可以看到已經顯示成功殺死了進程,并且在任務管理器中也已經沒有這個進程了

bat怎麼寫腳本(編寫BAT腳本管理進程)5

通過進程自身提供的命令來關閉進程

除了可以使用 ​taskkill​ 命令來關閉進程外,有些程序自身也有提供了管理進程本身的命令,我們可以通過這些命令來管理進程,比如nginx就有提供了 ​-s​ 參數來管理進程的關閉、重啟等操作

重啟進程

對于一些程序本身自帶了重啟命令的,我們可以直接使用程序本身的命令來對程序進程管理,對于沒有的則可以通過殺死進程後在啟動進程來達到重啟的效果

接收腳本參數

通過上面的步驟我們已經了解到了如何通過腳本來控制進程的啟動、關閉和重啟了,接下來就需要通過參數來控制腳本管理指定的腳本

首先我們需要一個參數來指定要啟動的進程,除此之外還需要另一個參數來管理是啟動還是關閉進程的指令

編輯腳本文件,加入如下内容

:: 關閉命令顯示 @echo off - :: 殺死進程 - :: /f 強制終止指定進程 - :: /t 終止指定的進程和由它啟動的子進程 - :: /im 指定要終止的進程的映像名稱。通配符 '*'可用來指定所有任務或映像名稱。 - taskkill /f /t /im nginx.exe :: 通過 %0~%n 可以獲取腳本輸入的參數,其中 %0 表示腳本的名稱 set commandName=%1 set serviceName=%2 echo CommandName: %commandName% echo ServiceName: %serviceName%

嘗試攜帶參數執行腳本查看結果,可以看到已經能正确獲取到了我們輸入的參數

bat怎麼寫腳本(編寫BAT腳本管理進程)6

接下來就要通過腳本中輸入的參數來控制進程的啟動和關閉了,編輯腳本,加入如下内容

:: 關閉命令顯示 @echo off :: 開啟延遲加載擴展 setlocal EnableDelayedExpansion ... - echo CommandName: %commandName% - echo ServiceName: %serviceName% :: 由于在批處理腳本中沒有數組的概念,但我們可以利用變量的延遲加載機制來模拟數組的效果 :: 因為有些程序啟動需要指定必要的一些參數,如nginx需要指定運行時目錄才能正常啟動,所以需要有一個變量來存儲默認的啟動參數 set args[nginx]=-p D:\Apps\Nginx-1.21.1 :: 利用延遲加載機制達到動态加載變量的目的 set args=!args[%serviceName%]! :: 設置啟動指令數組,使用變量數組來存儲指令命令,之後通過動态數組的方式來調用指定的指令 set commands[start]=start /b %serviceName% %args% set commands[stop]=taskkill /f /t /im %serviceName%.exe set commands[restart]=%commands[stop]% ^&^& %commands[start]% :: 執行指令 call !commands[%commandName%]!

嘗試執行腳本,可以看到現在已經可以通過腳本來控制nginx的啟動和關閉了

bat怎麼寫腳本(編寫BAT腳本管理進程)7

bat怎麼寫腳本(編寫BAT腳本管理進程)8

為程序配置獨立的服務文件

雖然現在已經可以通過該腳本來管理進程的啟動和關閉了,但是此腳本還是有着許多的問題,上面我們隻是配置了一個進程的啟動,可以看到每個進程的啟動參數都不一樣,如果都放到一個腳本裡面,随着進程的增多,腳本也會變得越來越大,所以為了可擴展性我們可以參考linux下的systemctl系統為每個進程編寫一個服務腳本

新建腳本文件 ​Systemctl.bat​ ,寫入如下内容

:: 關閉命令顯示 @echo off :: 開啟延遲加載擴展 setlocal EnableDelayedExpansion :: 接收腳本參數,通過 %0~%n 可以獲取腳本輸入的參數,其中 %0 表示腳本的名稱 set commandName=%1 set serviceName=%2 :: 設置數組,用來限定指令範圍 set commands[start]=Start set commands[stop]=Stop set commands[restart]=Restart set commands[status]=Status :: 設置service文件目錄 set servicePath=D:/Bin/services set serviceFile=%servicePath%/%serviceName%.service :: 參數驗證 if "%commandName%"=="" call :EndBatch "Error: 'command' is not null" if not defined commands[%commandName%] call :EndBatch "Error: invalid 'command', options command start\stop\restart" if not exist %serviceFile% call :EndBatch "Error: %serviceName%.service file is not exist" :: 檢查進程是否已運行 if "%commandName%"=="start" tasklist|find /i "%serviceName%.exe" && ( call :EndBatch "%serviceName%.exe in Running" ) :: 狀态查看 if "%commandName%"=="status" ( tasklist /fi "IMAGENAME eq %serviceName%.exe" call :EndBatch ) :: 讀取文件内容 for /f "delims=," %%i IN (%serviceFile%) do %%i :: 執行操作 call !service[%commandName%]! :: 輸出執行結果 if %errorlevel%==0 ( call :EndBatch "%serviceName% %commandName% success!" ) else ( call :EndBatch "%serviceName% %commandName% error!" ) :: 退出腳本 :EndBatch if not "%~1"=="" echo %~1 call :ExitBatch goto :eof :: 強制退出腳本代碼塊 :ExitBatch - Cleanly exit batch processing, regardless how many CALLs if not exist "%temp%\ExitBatchYes.txt" call :buildYes call :CtrlC <"%temp%\ExitBatchYes.txt" 1>nul 2>&1 :CtrlC cmd /c exit -1073741510 :buildYes - Establish a Yes file for the language used by the OS pushd "%temp%" set "yes=" copy nul ExitBatchYes.txt >nul for /f "delims=(/ tokens=2" %%Y in ( '"copy /-y nul ExitBatchYes.txt <nul"' ) do if not defined yes set "yes=%%Y" echo %yes%>ExitBatchYes.txt popd exit /b

在​ Systemctl.bat​ 文件同級目錄下新建 ​services​ 目錄,并在該目錄下新建 ​nginx.service​ 文件,寫入如下内容

set service[start]=start /b nginx -p D:\Apps\Nginx-1.21.1 set service[stop]=nginx -p D:\Apps\Nginx-1.21.1 -s stop set service[restart]=nginx -p D:\Apps\Nginx-1.21.1 -s reload

嘗試執行腳本,可以看到現在我們已經通過 Systemctl.bat 這個腳本文件來管理進程了,而且我們隻需要為需要管理的進程編寫service文件,就可以接入管理

bat怎麼寫腳本(編寫BAT腳本管理進程)9

bat怎麼寫腳本(編寫BAT腳本管理進程)10

在新建一個 ​php7.3-fpm.service​ 文件,輸入如下内容

set service[start]=start /b php7.3-cgi -b 127.0.0.1:9000 set service[stop]=taskkill /f /t /im php7.3-cgi.exe set service[restart]=!service[stop]! ^&^& !service[start]!

​mysqld.service​ 文件

set service[start]=net start MySQL8.0 set service[stop]=net stop MySQL8.0 set service[restart]=!service[stop]! ^&^& !service[start]!

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
男士羽絨服買什麼品牌比較好 男士羽絨服十大品牌排行榜
男士羽絨服買什麼品牌比較好 男士羽絨服十大品牌排行榜
每個季節的氣候溫度都是不一樣的,不同和季節我們要穿不同衣服,炎熱的夏天穿T恤短褲,寒冷的冬天穿棉褲羽絨服,尤其北方地區一到冬天室外溫度可以達到零下十幾度,外出時真的需要穿質量好的羽絨服來防寒。那麼男士買什麼牌子的羽絨服好呢?今天小編總結了男裝羽絨服品牌排行推薦。男士羽絨服十大品牌排行榜1.波司登——...
2024-05-04
12320是什麼電話 12320可以咨詢隔離政策嗎
12320是什麼電話 12320可以咨詢隔離政策嗎
疫情之下,尤其是處于疫情封控區、管控區的人們,對于疫情最新情況、防控措施等,都想第一時間了解,也有很多問題想要找相關人員進行咨詢。那麼,12320可以咨詢隔離政策嗎?12320是什麼電話呢?下面我們就來具體了解下,感興趣的小夥伴一起來看看吧。12320是什麼電話12320是衛生部設立的政府公益熱線電...
2024-05-04
什麼材質的砧闆比較不會滋生細菌 砧闆該怎麼消毒清理
什麼材質的砧闆比較不會滋生細菌 砧闆該怎麼消毒清理
大多數人都有這樣的觀念,認為砧闆沒壞,就沒有必要換新的。然而,有實驗研究證明,砧闆使用時間越久,上面的細菌滋生就會越嚴重。那麼什麼材質的砧闆比較不會滋生細菌?砧闆該怎麼消毒清理?下面小編帶來介紹。什麼材質的砧闆比較不會滋生細菌木質砧闆,是比較多人使用的砧闆。這種質地的砧闆,一般較為堅硬,對于經常需要...
2024-05-04
生闆栗如何保存
生闆栗如何保存
1、通風保存:闆栗買回來後,用簸箕将闆栗平鋪,放在通風處。通常2至3天左右,等表面水分幹了,懸挂在房...
2024-05-04
什麼叫隕石
什麼叫隕石
1、隕石也稱“隕星”,是地球以外脫離原有運行軌道的宇宙流星或塵碎塊飛快散落到地球或其它行星表面的未燃...
2024-05-04
Copyright 2023-2024 - www.tftnews.com All Rights Reserved