supervisor的介绍详见:https://www.studyscript.com/Post/index/id/3038.html
安装supervisor
#yum install python-setuptools //安装python安装工具
#easy_install supervisor //安装supervisor
生成supervisor配置文件
建立目录,并赋予所有者可读、可写、可执行(700)权限
#mkdir -m 700 -p /etc/supervisor
创建配置文件
#echo_supervisord_conf > /etc/supervisor/supervisord.conf
修改配置文件
#vi /etc/supervisor/supervisord.conf
在文件的尾部添加如下配置:
;conf.d 为配置表目录的文件夹,需要手动创建
[include]
files = /etc/supervisor/conf.d/*.conf
如下图所示:
创建进程配置文件
创建进程配置文件存放目录
#mkdir -m 700 /etc/supervisor/conf.d
创建进程配置文件
#vi /etc/supervisor/conf.d/testsupervisor.conf
编辑内容
[program:AspNetCoreDeployDemo] ;程序名称,终端控制时需要的标识
command=dotnet AspNetCoreDeployDemo.dll ; 运行程序的命令
directory=/root/NetCore/FDD/ ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/AspNetCoreDeployDemo.err.log ; 错误日志文件
stdout_logfile=/var/log/AspNetCoreDeployDemo.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT
startsecs=10 ;自动重启时间间隔
创建supervisor自启动服务
#vi /lib/systemd/system/supervisor.service
编辑内容:
[Unit]
Description=supervisor
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
赋予权限:
#chmod 754 /lib/systemd/system/supervisor.service
设置开机自启动
#systemctl enable supervisor.service
运行服务
supervisorctl reload
supervisorctl start testsupervisor
出现错误不能成功运行,如果网上搜索 "supervisor Exited too quickly (process log may have details)”或按照supervisor日志里的错误信息搜索,多数会告诉你目录是否配置错误、目录是否有对应权限、dotnet 命令是否能正常运行等。
为控制台程序添加宿主
在asp.net core中我们都知道有个WebHost
asp.net core 中的WebHost
在控制台中我们需要添加HostBuilder来作为宿主。
通过Nuget 添加Microsoft.Extensions.Hosting
修改控制台的Main函数
{
Console.WriteLine($"控制台程序已经启动:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}\r\n"); var hostBuilder = new HostBuilder()
.ConfigureServices(serviceCollection => { //注册我们的服务接口
serviceCollection.AddSingleton<IHostedService, MyService>();
}); await hostBuilder.RunConsoleAsync();
}
一般情况Main函数改为异步后变异会报错,会提示找不到合适的静态入口;可以设置语言版本为C#7.1及以上来解决。
我们需要添加一个服务文类用来继承我们的宿主IHostedService接口,并重写服务启动和结束方法。
class MyService : IHostedService
{ /// <summary>
/// 服务启动 /// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task StartAsync(CancellationToken cancellationToken)
{ return Task.Run(() => {
Console.WriteLine("控制台程序已经开启"); //模拟定时需要后台处理的任务
new Task(() => { while (true)
{
Console.WriteLine("当前时间是:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
Thread.Sleep(1000);
}
}).Start();
});
} /// <summary>
/// 服务停止 /// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task StopAsync(CancellationToken cancellationToken)
{ return Task.Run(() => {
Console.WriteLine("控制台程序已经停止");
});
}
}
发布然后使用supervisorctl start testsupervisor 开启看看.