场景
有时候我们需要将程序一直重复在后台运行,例如我们需要用php来监听数据库中是否有需要发送的短信和邮件,如果有则执行发送操作。那么这个程序需要一直在后台运行,有时候程序会崩溃,我们希望程序可以自动重启而不是手动重启。
NSSM简介
NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行。同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大。它的特点如下:
- 支持普通exe程序(控制台程序或者带界面的Windows程序都可以)
- 开箱即用,操作简单
- 可以重定向输出日志信息以及错误日志信息
- 可以自动守护封装了的服务,程序挂掉了后可以自动重启
- 可以自定义环境变量
官方下载地址:http://www.nssm.cc/download
备用下载地址:nssm 2.24
示例
例如这里有一个PHP程序test.php
需要重复在后台执行,test.php
代码如下:
<?php
while(true){
echo date('Y-m-d H:i:s')."\r\n";
error_log(date('Y-m-d H:i:s')."\r\n",3,'D:\log.txt');
sleep(2);
}
我们使用php test.php
即可执行以上程序。效果如下图:
只要我们不关闭这个窗口,程序将一直执行下去。
但很多时候程序会莫名其妙就挂掉,那么我们只能再次执行php test.php
来重启程序。
将程序封装为windows服务
下载NSSM后,进入nssm.exe
文件所在的文件夹,在cmd中执行:nssm install MyService
打开nssm的配置界面,如下图:
安装服务后,将在注册表\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService\Parameters
中自动录入以下信息:
启动服务
也可以输入命令:nssm start MyService
启动服务。
启动服务后,可以看到D:\log.txt
文件不断有内容写入,说明PHP程序已开始执行。
模拟程序崩溃
打开windows任务管理器,结束php.exe这个进程,会发现,结束后,立马会有一个新的php.exe进程重启,前面的PHP程序仍然在执行。
nssm常用命令
安装服务实例:nssm install +【服务实例名称】
删除服务实例:nssm remove +【服务实例名称】
删除服务实例并确定:nssm remove +【服务实例名称】 confirm
修改服务(显示界面进行修改):nssm edit +【服务实例名称】
启动服务:nssm start +【服务实例名称】
停止服务:nssm stop + 【服务实例名称】
重启服务:nssm restart + 【服务实例名称】