公司法
当前位置: 首页 法律大全

bat怎么写脚本(编写BAT脚本管理进程)

时间:2023-06-09 作者: 小编 阅读量: 1 栏目名: 法律大全

编写BAT脚本管理进程概述最近在Windows上搭建了个PHPMySQLnginx的开发环境,但是发现除了mysql可以注册成服务启动外,PHP和Nginx都无法注册成为服务,这样一来管理管理进程的启动和关闭就成了一件麻烦。

概述

最近在Windows上搭建了个PHP MySQL nginx的开发环境,但是发现除了mysql可以注册成服务启动外,PHP和Nginx都无法注册成为服务,这样一来管理管理进程的启动和关闭就成了一件麻烦的事情,于是就想着写一个脚本来管理PHP和Nginx进程的启动和关闭,首先这个脚本接收两个参数:服务名和指令,用于指定管理的进程名称,可以对进程进行启动、关闭、重启等操作

通过脚本启动进程

在批处理脚本中可以通过 start 命令来启动一个进程,下面以启动nginx为例,新建一个脚本文件 PhpTools.bat ,并写入如下内容

:: 关闭命令显示@echo off:: 需要确认已经将nginx进程加入到系统环境变量中,否则会出现找不到进程的错误,如果不想加入到环境变量,则可以指定完整的程序路径如:start /b nginx.exe:: /b 参数指定以后台进程方式来运行程序start /b nginx

尝试运行脚本查看结果,得到了一个错误,从错误信息中可以看出似乎是找不到配置文件的问题

通过排查发现,nginx在运行时默认以当前执行进程的目录为运行时目录,但是因为当前目录中并没有运行时所需要的必要文件环境,所以出现了上面的错误,在nginx中可以通过 ​-p​ 参数来指定运行时的主目录

编辑脚本文件,指定nginx运行时的主目录

:: 关闭命令显示@echo off...- start /b nginxstart /b nginx -p D:\Apps\Nginx-1.21.1

再次执行脚本,可以看到这次没有出现错误了,并且在任务管理器中也能查看到对应的进程

通过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​ 也是不能忽略的

编辑脚本文件,加入完整的进程名称

:: 关闭命令显示@echo off...- taskkill /f /t /im nginxtaskkill /f /t /im nginx.exe

再次执行脚本,可以看到已经显示成功杀死了进程,并且在任务管理器中也已经没有这个进程了

通过进程自身提供的命令来关闭进程

除了可以使用 ​taskkill​ 命令来关闭进程外,有些程序自身也有提供了管理进程本身的命令,我们可以通过这些命令来管理进程,比如nginx就有提供了 ​-s​ 参数来管理进程的关闭、重启等操作

重启进程

对于一些程序本身自带了重启命令的,我们可以直接使用程序本身的命令来对程序进程管理,对于没有的则可以通过杀死进程后在启动进程来达到重启的效果

接收脚本参数

通过上面的步骤我们已经了解到了如何通过脚本来控制进程的启动、关闭和重启了,接下来就需要通过参数来控制脚本管理指定的脚本

首先我们需要一个参数来指定要启动的进程,除此之外还需要另一个参数来管理是启动还是关闭进程的指令

编辑脚本文件,加入如下内容

:: 关闭命令显示@echo off- :: 杀死进程- :: /f 强制终止指定进程- :: /t 终止指定的进程和由它启动的子进程- :: /im 指定要终止的进程的映像名称。通配符 '*'可用来指定所有任务或映像名称。- taskkill /f /t /im nginx.exe:: 通过 %0~%n 可以获取脚本输入的参数,其中 %0 表示脚本的名称set commandName=%1set serviceName=%2echo CommandName: %commandName%echo ServiceName: %serviceName%

尝试携带参数执行脚本查看结果,可以看到已经能正确获取到了我们输入的参数

接下来就要通过脚本中输入的参数来控制进程的启动和关闭了,编辑脚本,加入如下内容

:: 关闭命令显示@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%.exeset commands[restart]=%commands[stop]% ^&^& %commands[start]%:: 执行指令call !commands[%commandName%]!

尝试执行脚本,可以看到现在已经可以通过脚本来控制nginx的启动和关闭了

为程序配置独立的服务文件

虽然现在已经可以通过该脚本来管理进程的启动和关闭了,但是此脚本还是有着许多的问题,上面我们只是配置了一个进程的启动,可以看到每个进程的启动参数都不一样,如果都放到一个脚本里面,随着进程的增多,脚本也会变得越来越大,所以为了可扩展性我们可以参考linux下的systemctl系统为每个进程编写一个服务脚本

新建脚本文件 ​Systemctl.bat​ ,写入如下内容

:: 关闭命令显示@echo off:: 开启延迟加载扩展setlocal EnableDelayedExpansion:: 接收脚本参数,通过 %0~%n 可以获取脚本输入的参数,其中 %0 表示脚本的名称set commandName=%1set serviceName=%2:: 设置数组,用来限定指令范围set commands[start]=Startset commands[stop]=Stopset commands[restart]=Restartset commands[status]=Status:: 设置service文件目录set servicePath=D:/Bin/servicesset 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!"):: 退出脚本:EndBatchif not "%~1"=="" echo %~1call :ExitBatchgoto :eof:: 强制退出脚本代码块:ExitBatch - Cleanly exit batch processing, regardless how many CALLsif not exist "%temp%\ExitBatchYes.txt" call :buildYescall :CtrlC <"%temp%\ExitBatchYes.txt" 1>nul 2>&1:CtrlCcmd /c exit -1073741510:buildYes - Establish a Yes file for the language used by the OSpushd "%temp%"set "yes="copy nul ExitBatchYes.txt >nulfor /f "delims=(/ tokens=2" %%Y in ('"copy /-y nul ExitBatchYes.txt <nul"') do if not defined yes set "yes=%%Y"echo %yes%>ExitBatchYes.txtpopdexit /b

在​ Systemctl.bat​ 文件同级目录下新建 ​services​ 目录,并在该目录下新建 ​nginx.service​ 文件,写入如下内容

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

尝试执行脚本,可以看到现在我们已经通过 Systemctl.bat 这个脚本文件来管理进程了,而且我们只需要为需要管理的进程编写service文件,就可以接入管理

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

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

​mysqld.service​ 文件

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

    推荐阅读
  • 怎样烧红烧肉(家常红烧肉的做法)

    怎样烧红烧肉原料:精品五花肉、炖肉料包、葱、冰糖、茶叶。五花肉切条放入凉水中撇去血沫。焯水定型;捞出后晾凉切一样大的方块。锅中放少许油倒入白砂糖炒糖色。糖色的气泡由大变小迅速关火,倒入开水。加少许绍酒,加开水烧,熟得快,加入茶叶水,可以去腥味。改回炒锅大火,放冰糖,使汁粘稠即可出锅,香葱段点缀。

  • 2022杭州径山茶圣节时间、地点、活动一览

    最终集齐所有铜币的游客可至“大宋钱庄”兑换神秘礼物。今来茶韵生活01、陆羽说论坛为进一步挖掘径山茶宴有关历史文化,本届茶圣节特邀请茶学专家交流讨论如何更好保护和传承国家非物质文化遗产。为打造文化传播年,第二十一届中国茶圣节以春迎、夏凉、秋韵、冬福四大主题贯穿全年。

  • 《重生之门》给罗队发短信的人身份

    但是通过前文,不难推测应该是庄文杰发给罗队的短信,只是没有暴露自己的身份。罗坚来到青檀假日酒店排查,没有发现任何异常,庄文杰和许正清乔装改扮随后赶来,他们一出现就被人盯上,庄文杰和许正清来到地下停车场,庄文杰巧妙引开那些人,混进游客中进入酒店。这件事情把十二年前的洛神案串联起来了。

  • 爱情名著哪个好看(随侃名著佳作第6期)

    言下之意,他主动向周晓白提出分手。钟跃民成为一个军人,上了战场,并且是在战斗中受伤,被送到战地医疗帐篷内救治。而周晓白和钟跃民在时隔十多年后的相遇一刻,也是被编剧以及导演,安排得相当的特别,并不是那种悲情欲绝又或者是感动无比的相遇时刻。

  • 板栗可以保存多久 板栗怎么能保存时间长

    如果是晒干的板栗可以存放3-4个月,生板栗在常温下合理贮存可以存放1-2个月,煮熟的栗子大概可以放一周,熟板栗放冰箱冷冻能保存30天左右,熟板栗放冰箱冷藏保存可以存放5天。

  • 贾宝玉与红楼梦的关系(贾宝玉的春梦到底在暗示什么)

    贾宝玉与红楼梦的关系?要知道,贾琏这个人极其好色,而且好的就是熟女,那么从这个曲折的描述中,我们可以推断出,秦可卿应该是那种熟女中的极品。这个问题在书中得不到直接的答案,因为在后面的文章中,秦可卿一共只出现三个镜头:介绍弟弟秦钟与贾宝玉相见,秦可卿病后王熙凤带贾宝玉去探病,秦可卿临死前在梦里向王熙凤交代后事。

  • 简单又好看的剪纸适合儿童(孩子能学会的幼儿简单剪纸教程)

    接下来我们就一起去研究一下吧!简单又好看的剪纸适合儿童幼儿园的孩子经常要做各种各样的手工,通过做手工,提高孩子的审美能力,锻炼孩子的动手能力,培养孩子的专注力和耐心,让孩子更聪明。用蓝天白云绿色的草地,太阳、小兔子和小蘑菇,可以贴出一幅画,也可以用这个画面编出一个小故事,带孩子度过愉快的亲子时光。欢迎关注,学习更多幼儿小手工。

  • 摩尔庄园钓鲤鱼的最佳方法(摩尔庄园钓鲤鱼的有什么最佳方法)

    以下内容希望对你有帮助!摩尔庄园钓鲤鱼的最佳方法工具/原料:华为手机、安卓系统、摩尔庄园游戏。进入游戏后操纵游戏角色进行移动了。去商店购买钓鱼的诱饵。来到池塘边进行的钓鱼。等待的水面出现波动即可钓到鲤鱼了。

  • 国外的懒人产品(歪国产品咖在用哪些可爱的小工具)

    quotes=trueUsabilityHub我通常使用UsabilityHub来帮助确定设计方案。

  • 一年四季水果时间表(一年四季的时令水果是什么)

    3月(春季):枇杷、红香蕉、樱桃、杨桃、番荔枝、青枣、甘果蔗、草莓、番石榴、牛奶蕉、柑桔、观赏南瓜、果桑、鹤首瓜。12月(冬季):樱桃、番茄、红香蕉、鸡蛋果、木瓜、草莓、百香果、杨桃、无花果、番石榴、牛奶蕉、鹤首瓜、观赏南瓜、果蔗、台湾青枣、黑提子、人心果、柠檬、菠萝、油梨、柑橘、橙子。