当前位置: 首页 > article >正文

.net core 创建linux服务,并实现服务的自我更新

目录

  • 创建服务
  • 创建另一个服务,用于执行更新操作
  • 给你的用户配置一些systemctl命令权限

创建服务

/etc/systemd/system下新建服务配置文件:yourapp.service,内容如下:

[Unit]
Description=yourapp
After=network.target

[Service]
Type=simple
WorkingDirectory=/home
ExecStart=/home/yourapp
Restart=always
User=your_user_name

[Install]
WantedBy=multi-user.target

如果你是修改现有的配置文件,需要让systemctl重载一下:

systemctl stop yourapp
systemctl disable yourapp.service
systemctl daemon-reload

启动服务:

systemctl enable yourapp
systemctl start yourapp

创建另一个服务,用于执行更新操作

程序要更新,不能自己下载更新文件,然后覆盖自己,有可能会报异常:文件无法改写。
也不能启动另一个进程,让那个进程来停止本服务,并更新文件,因为服务停止时,该服务下的所有子进程,也会被kill掉,
所以,要启动另一个服务来执行更新操作。

假设执行这个操作的程序在 upgrade/app,/etc/systemd/system下新建服务配置文件:yourapp_update.service,内容如下:

[Unit]
Description=yourapp_update
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/upgrade
ExecStart=/home/upgrade/app
Restart=no
User=your_user_name

[Install]
WantedBy=multi-user.target

注意:Restart=no,这个程序无须自动重启

激活服务,无须启动该服务:

systemctl enable yourapp_update

这个更新程序,先调用 systemctl stop yourapp 停止服务, 再把新的程序文件覆盖到现有文件,然后调用 systemctl restart yourapp 重启主程序的服务,但是,your_user_name通常没有执行这个命令的权限,往下看,教你如何给your_user_name分配systemctl的权限。

给你的用户配置一些systemctl命令权限

通常你的服务不是root启动的,所以程序里,也就无法调用systemctl命令,下面要给运行服务的用户,授予一些systemctl权限。

在/etc/sudoers.d路径下,创建文件 yourapp,确认此文件所有人为 root,文件权限是 440(chmod 440 文件名)。
文件内容:

your_user_name ALL=(ALL) NOPASSWD: /bin/systemctl restart yourapp.service
your_user_name ALL=(ALL) NOPASSWD: /bin/systemctl start yourapp.service
your_user_name ALL=(ALL) NOPASSWD: /bin/systemctl stop yourapp.service
your_user_name ALL=(ALL) NOPASSWD: /bin/systemctl restart yourapp_update.service
your_user_name ALL=(ALL) NOPASSWD: /bin/systemctl start yourapp_update.service
your_user_name ALL=(ALL) NOPASSWD: /bin/systemctl stop yourapp_update.service

这样,your_user_name 用户就有控制这两个服务的权限了。


http://www.kler.cn/a/417791.html

相关文章:

  • 《运放秘籍》第二部:仪表放大器专项知识点总结
  • 本地部署 WireGuard 无需公网 IP 实现异地组网
  • C-操作符
  • 接口测试工具:reqable
  • 1、SpringBoo中Mybatis多数据源动态切换
  • 代码设计:设计模式:应对变化
  • 【AI日记】24.11.30 kaggle 比赛 Titanic-3
  • 万字长文解读深度学习——多模态模型BLIP2
  • LinkedList的了解
  • 如何利用蓝燕云零代码平台构建工程企业成本控制系统?
  • DroneCAN 最新开发进展,Andrew在Ardupilot开发者大会2024的演讲
  • 初级数据结构——二叉树题库(c++)
  • docker上手记录
  • CANoe中Test Module如何快速针对某项内容进行压力测试、鲁棒性测试
  • git使用记录与总结
  • 设置Mysql5.6允许外网访问
  • 让 AI 帮忙做 code review
  • .NET 9 AOT的突破 - 支持老旧Win7与XP环境
  • 1-1 Gerrit实用指南
  • Elasticearch索引mapping写入、查看、修改
  • 【AI赋能 Python编程】 第十三章 AI辅助单元测试生成指南
  • 基于多VSG独立微网的多目标二次控制MATLAB仿真模型
  • 乘积最大子数组
  • 南京移动“智慧+关怀”服务体系助力老年群体生活安全有保障
  • C/C++ 每日一练:在矩阵中查找特定值
  • 异步处理优化:多线程线程池与消息队列的选择与应用