打开Visual Studio,看.net core模板里只有控制台程序和web程序,那我们以前在windows上跑的windows service跑,那在CentOS上能不能做类似的实现呢?

当然可以,解决方案就是守护进程,百度到的守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意思)

这次我选择的工具的是supervisor,下面我们首先安装一下吧,执行命令

# yum install supervisor
# systemctl enable supervisord.service
# systemctl start supervisord.service
# systemctl status supervisord.service
 Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled)
   Active: active (running) since 六 2016-09-17 06:41:26 CST; 2h 54min ago
  Process: 2667 ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf (code=exited, status=0/SUCCESS)

看到supervisord.service已经成功启动了,是不是觉得总是打命令太枯燥了呢,能用界面管理服务就很美妙了呢,很幸运的是,supervisor提供了这样的功能,修改/etc/supervisord.conf中的配置

[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9001        ; (ip_address:port specifier, *:port for all iface)

由上面的注释就可以看出原来是被禁用的,我只是把前面的分号去掉,即去掉注释,把原来的127.0.0.1:9001,修改为*:9001,允许各种可被访问的方式。 访问http://192.168.91.128:9001/

system和vendor 的库相互引用 systemctl vendor preset_操作系统

再看配置文件,看到了

[include]
files = supervisord.d/*.ini

那我们修改为

[include]
files = supervisord.d/*.conf

以后我们配置的服务都放在/etc/supervisord.d目录下,以后缀名conf结尾,就可以成为被supervisor管理的服务了,是不是很easy呢! 配置了这么久supervisor,是该干点正事了,费话不说,首先用定时器模拟我们在平常项目中定时执行某个任务,为了简单起见,我只是定时把当前时间输出到叫aa.txt中,代码如下

var fileName = "aa.txt";

            if (File.Exists(fileName))
            {
                File.CreateText(fileName).Dispose();
            }
            using( var t = new Timer((o) =>
            {
                var currentTime =DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

                File.AppendAllText(fileName,$"{currentTime}{Environment.NewLine}");
            }, null, 1000, 2000)
            )
            {
               Console.Read();
            }

我们把代码还写在我们上个hellodemo项目中,在开发测试环境没问题之后,新建hellodemo.conf, 配置如下

[program:hellodemo]
command=dotnet hellodemo.dll ; 运行程序的命令
directory=/hello ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/hellodemo.err.log ; 错误日志文件
stdout_logfile=/var/log/hellodemo.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行

上传至/etc/supervisord.d,执行命令

# supervisorctl reload
Restarted supervisord

打开 http://192.168.91.128:9001/

system和vendor 的库相互引用 systemctl vendor preset_操作系统_02

现在我们把hellodemo关掉,看看会不会自动重启,执行命令

# kill 7756 #杀掉进程

刷新supervisor管理界面

system和vendor 的库相互引用 systemctl vendor preset_网络_03

可以看到已经自动重启了,那我们发版的时候是不是要把服务先关掉呢,在界面上直接点Stop,

system和vendor 的库相互引用 systemctl vendor preset_网络_03

好了,到此为止,大功告成了,赶快动手试试吧!