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

embedded/2024/12/4 4:00:00/

目录

  • 创建服务
  • 创建另一个服务,用于执行更新操作
  • 给你的用户配置一些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.ppmy.cn/embedded/142794.html

相关文章

架构03-事务处理

零、文章目录 架构03-事务处理 1、本地事务实现原子性和持久性 (1)事务类型 **本地事务:**单个服务、单个数据源**全局事务:**单个服务、多个数据源**共享事务:**多个服务、单个数据源**分布式事务:**多…

C语言第十四周课——课堂练习

目录 1.冒泡法排序(降序排列) 2.控制台输出100以内的素数 3. 计算1-100的和 1.冒泡法排序(降序排列) 要求使用for循环,并且写死数据 写死数据:不从控制台输入,在排序前定义好需要排序的数据 …

【算法刷题指南】优先级队列

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

【linux】(21)进程端口排查-fuser

fuser 是一个用于显示进程使用的文件、套接字或端口的 Linux 命令。它可以帮助诊断某个文件、目录、端口或设备被哪个进程占用。 基本语法 fuser [选项] 文件或端口常用选项 选项说明-a显示所有指定文件或端口的进程信息。-k杀死占用指定文件或端口的进程。-i在杀死进程前询问…

在线家具商城基于 SpringBoot:设计模式与实现方法探究

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料,分析人员可以根据这些信息确定出本系统具备的功能,分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作,但是…

LearnOpenGL学习(光照 -- 投光物,多光源)

完整代码见:zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 投光物 将光投射(Cast)到物体的光源叫做投光物(Light Caster) 平行光 当我们使用一个假设光源处于无限远处的模型时,它就被称为定向光,因为它的所有光线都有着相同的方向&#x…

mysql order by后进行limit分页查询出现重复数据

1、场景:管理台列表查询莫名出现重复数据,第一页的最后几条数据在第二页的最上面也出现了。 select c.* from (select a.* from a where xxx union select b.* from b where xxx ) c where xxx order by c.acct_date desc limit pageSize,pageNum 2、排…

Jenkins的使用

文章目录 一、Jenkins是什么\有什么用\与GitLab的对比二、Jenkins的安装与配置Jenkins的安装方式在Linux上安装Jenkins:在Windows上安装Jenkins:配置Jenkins: (可选)配置启动用户为root(一定要是root吗??…