Windows 服务器断电后自动重启服务的实现:批处理脚本与任务计划程序配置指南
作者:Ake 发布于:2023年4月26日
问题
前段时间公司的机房经常断电,每断一次电我就得把我负责的那台服务器(Windows Server)上的服务全部重启一遍,非常的无聊,有这时间摸会鱼多好。于是直接花了点时间写了个脚本,然后配置到了任务计划程序,从此再也不用我手动操作了。
脚本编写
由于是 Windows 服务器,所以这里写的是cmd脚本文件,后缀名为.bat
或者.cmd
都可以。
启动一个个服务的过程其实就是在命令行中不同的工作目录执行不同的命令,所以使用下面这行命令就可以直接启动一个 cmd 窗口并导航到相应工作目录在其中执行对应命令,比如:
start cmd /D "D:/nodeProjects/project1" /K "npm start"
其中/D
后指定了工作目录,也就是命令执行的位置,/K
后指定了要运行的命令。
要启动多少个服务把这行复制多少个,改改目录和命令就可以了。
不过有时情况没这么简单,在命令执行之前可能还需要设置一些必要的环境变量。比如在我维护的这台服务器上,一些老的 Node 项目需要使用 Node8,而一些新的 Node 项目需要使用Node16,所以在不同的 Node 项目里我就需要通过将不同版本 Node 安装目录设置到环境变量 PATH 中,比如:
start cmd /D "D:/nodeProjects/project1" /K "set sk=xxx && set PATH="C:\Program Files\nodejs";%PATH% && npm start"
通过set key=value
的形式来设置环境变量,通过%key%
来引用某个环境变量,通过&&
来连接多个命令。
由于路径中含有空格,所以该路径需要使用双引号包裹起来,不同于其他语言,这块的双引号无需进行转义。
或者可以使用^
对空格进行转义,如下:
start cmd /D "D:/nodeProjects/project1" /K "set sk=xxx && set PATH=C:\Program^ Files\nodejs;%PATH% && npm start"
到这块基本上可以实现重启服务的功能了,但是这样启动后会有许多的 cmd 窗口,而且窗口标题还都大差不差,如果哪天需要单独停止或重启某个服务,那找到这个窗口就得花一番功夫。那能不能给启动的每个 cmd 窗口都起一个名字呢?可以的,如下:
start "Project1" cmd /D "D:/nodeProjects/project1" /K "npm start"
其中Project1
就是我们给窗口起的名字,这样日后找这个窗口就方便多了。(更新:其实其中的命令执行后窗口的名字会被命令覆盖掉,所以不用起名了,白起,这里当个知识点记录一下)。
在 cmd 脚本中也可使用注释,如下:
REM 这里是注释
合理添加注释可以使脚本或命令的功能更清晰。
掌握了这些基本写一个服务重启脚本已经足够了,保存该脚本文件后双击它就可以启动所有的服务了。
如果还有更多需求可以在 cmd 中输入help start
和help cmd
查看 start 命令和 cmd 命令的更多用法(注意是 cmd,不要在 powershell 中输入)。
配置到任务计划程序
虽然现在已经很方便了,只需要远程到服务器进行双击就可以了,但感觉还可以简化,如果能开机时直接运行该脚本,那我不是连登录都不用登录了,根本什么都不需要管,还好 Windows 的任务计划程序提供了这一功能。步骤如下:
- 在 Windows 菜单中找到任务计划程序并打开;
- 点击创建基本任务;
- 填入名称和描述,点击下一步;
- 在触发器中选择计算机启动时 ;
- 在操作中选择启动程序 ,点击下一步;
- 点击浏览,选择之前编写好的脚本,点击下一步;
- 点击完成。
好了,万事大吉,可以愉快摸鱼了!
(更新:服务器重启后进入桌面不会有cmd窗口,但服务其实已经通过任务计划程序恢复了)。