Ubuntu 自启动应用程序的方法

1、自启动的方法

      自启动应用程序可以在/etc/rc.local文件中调用脚本来启动应用程序,另外也可以自行编写一个服务来启动应用程序。这两种方法其实都是一种方法即使用服务来启动一个应用程序。rc.local脚本本身也是被一个rc.local的服务来调用的。如下图,可以看出rc-local.servce服务调用/etc/rc.local脚本中的相关程序来启动应用。

编写服务配置 
每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]
[Unit]:记录unit文件的通用信息。[Service]:记录Service的信息[Install]:安装信息。[Unit]
主要是对这个服务的说明,内容, 文档介绍以及对一些依赖服务定义Description : 服务的简单描述
Documentation : 服务文档
Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
Wants:与当前 Unit 需要的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
BindsTo与当前 Unit 绑定的其他 Unit,如果它们退出,会导致当前 Unit 停止运行
Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
Condition…:当前 Unit 运行必须满足的条件,否则不会运行
Assert…:当前 Unit 运行必须满足的条件,否则会报启动失败
如[Unit]
Description=Protect ARP list
Wants=network-online.target
After=network.target
其中network.target代表有网路,network-online.target代表一个连通着的网络。[service]
服务本体在定义完了 Systemd 用来识别服务的单元后,我们来定义服务本体。基本的用法如下:Type:服务的类型,各种类型的区别如下所示simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。
forking:标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。(以 fork 方式从父进程创建子进程,创建后父进程会立即退出)
oneshot:systemd中的Type=oneshot服务描述了这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。
notify: 这个程序在启动完成后会通过 sd_notify 发送一个通知消息。所以还需要配合 NotifyAccess 来让 Systemd 接收消息,后者有三个级别:none,所有消息都忽略掉; main,只接受我们程序的主进程发过去的消息; all,我们程序的所有进程发过去的消息都算。NotifyAccess 要是不写的话默认是 main。(当前服务启动完毕,会通知Systemd,再继续往下执行)
ExecStart
启动当前服务的命令ExecStartPre
启动当前服务之前执行的命令ExecStartPost
启动当前服务之后执行的命令ExecReload
重启当前服务时执行的命令ExecStop
停止当前服务时执行的命令ExecStopPost
停止当其服务之后执行的命令RestartSec
自动重启当前服务间隔的秒数Restart
定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdogno(默认值):退出后不会重启;
always:不管是什么退出原因,总是重启;
on-success:只有正常退出时(退出状态码为0),才会重启;
on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启;
on-abnormal:只有被信号终止和超时,才会重启;
on-abort:只有在收到没有捕捉到的信号终止时,才会重启;
on-watchdog:超时退出,才会重启,如ssh服务设置为on-failure,表示任何意外的失败,就将重启sshd。如果sshd正常停止(比如执行systemctl stop命令),它就不会重启。
TimeoutSec
定义 Systemd 停止当前服务之前等待的秒数RemainAfterExit
值为yes或no,表示进程退出以后,服务仍然保持执行。这样的话,一旦使用systemctl stop命令停止服务,ExecStop指定的命令就会执行通常和type=oneshot配合使用Environment
指定环境变量EnvironmentFile
指定当前服务的环境参数文件,该文件的key=value键值对,可以用$key的形式,在当前配置文件中获取User
指定用户运行Group
指定用户组运行WorkingDirectory
进程工作目录,也就是说在执行前会先切换到这个目录[Install]
服务安装的相关设置,一般可设置为多用户的WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中Alias:当前 Unit 可用于启动的别名(比如Master.service文件名字,正常 systemctl status Master.service,设置别名叫Alias=nm,那你就可以systemctl status nm.service 查看实际是Master.service的服务了)Also:当前 Unit 激活(enable)时,会被同时激活的其他 UnitLinux 缓和的执行进程关闭,然后重启。在对配置文件修改后需要重启进程时可发送此信号。*.target级别
0runlevel0.target,poweroff.target关闭系统。
1runlevel1.target,rescue.target进入救援模式。
2runlevel2.target,multi-user.target进入非图形界面的多用户方式。
3runlevel3.target,multi-user.target进入非图形界面的多用户方式。
4runlevel4.target,multi-user.target进入非图形界面的多用户方式。
5runlevel5.target,graphical.target进入图形界面的多用户方式。
6runlevel6.target,reboot.target重启系统。如:WantedBy=multi-user.target 在 multi-user.target 启用时,我们的服务也就会被启用了。完整实例
[Unit]Description=Protect ARP listWants=network-online.targetAfter=network.target[Service]Type=oneshotRemainAfterExit=yesExecStart=/sbin/arp -f /etc/ip-macExecReload=/sbin/arp -f /etc/ip-macExecStop=/sbin/arp -d -a[Install]WantedBy=multi-user.target
eiota@firefly:~$ systemctl status rc-local
● rc-local.service - /etc/rc.local CompatibilityLoaded: loaded (/lib/systemd/system/rc-local.service; enabled-runtime; vendor preset: enabled)Drop-In: /usr/lib/systemd/system/rc-local.service.d└─debian.confActive: active (running) since Fri 2024-03-29 14:20:24 CST; 2 days agoDocs: man:systemd-rc-local-generator(8)Process: 516 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)Tasks: 104 (limit: 4661)Memory: 745.8MCGroup: /system.slice/rc-local.service├─   519 sudo ./app.sh├─   538 /bin/bash ./app.sh├─   555 sudo -S ./tysoftdog.sh├─   562 /bin/bash ./tysoftdog.sh├─   569 java -Dfile.encoding=utf-8 -jar /home/eiota/ansm/ansm-0.0.1-SNAPSHOT.war├─  1532 ./eiota_server├─  1606 sudo -S python3.8 main.py├─  1608 python3.8 main.py├─312519 sleep 20└─312531 sleep 10Warning: some journal files were not opened due to insufficient permissions.

2、自行编写一个服务

        首先学习一下service文件的写法, service文件放在/lib/systemd/system目录下面,下面以docker.serice文件为示例:


eiota@firefly:/lib/systemd/system$ cat docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes# kill only the docker process, not all processes in the cgroup
KillMode=process
OOMScoreAdjust=-500[Install]
WantedBy=multi-user.target

     编写一个服务程序用于启动一个/home/eiota/test.py程序,服务文件的内容如下,放在/lib/systemd/system目录下。 

eiota@firefly:/lib/systemd/system$ cat zsm_test.service
[Unit]
Description=zsm test Service
#在网络启动后
After=network.target[Service]
Type=simple
ExecStart=/home/eiota/test.py
#程序意外退出, 延时2秒自动重启
RestartSec=2
Restart=always[Install]
#允许多个用户
WantedBy=multi-user.target

       编写好服务文件后需要执行sudo systemctl daemon-reload  重启加载新增的服务,

       sudo systemctl enable zsm_test.service   使能服务,

       sudo systemctl start zsm_test.service       启动服务。后面设备再开机就能实现服务的自动启动了。

       sudo systemctl stop zsm_test.service   停止服务,

       sudo systemctl disable zsm_test.service       禁止服务。后面设备再开机就不自动启动了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB聚合运算符:$lt

文章目录 MongoDB聚合运算符&#xff1a;$lt语法举例 MongoDB聚合运算符&#xff1a;$lt $lt聚合运算符用于比较两个值&#xff0c;如果第一个小于第二个&#xff0c;返回true&#xff1b;如果第一个小于等于第二个&#xff0c;返回false。 语法 { $lt: [ <expression1&g…

【DevOps工具篇】LDAP GUI管理工具

【DevOps工具篇】LDAP GUI管理工具 目录 【DevOps工具篇】LDAP GUI管理工具LDAP管理工具“phpLDAPadmin”管理LDAP数据管理LDAP服务器LDAP管理工具“phpLDAPadmin”的模板功能LDAP管理工具“postLDAPadmin”LDAP管理工具“web2ldap”LDAP管理工具“ldap-ui”LDAP管理工具“go-l…

构建第一个ArkTS应用(Stage模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Servi…

2024年04月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年04月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

kafka面试常见问题

1、如何判断kafka某个主题消息堆积&#xff1f; 要判断Kafka中某个主题的消息是否堆积&#xff0c;可以通过查看该主题的生产者和消费者的偏移量&#xff08;offset&#xff09;差异来实现。Kafka中的每条消息在主题的分区内都有一个唯一的偏移量&#xff0c;生产者每发送一条…

【面试八股总结】传输控制协议TCP(一)

一、什么是TCP协议 TCP是传输控制协议Transmission Control Protocol TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接的&#xff1a;每条TCP连接杜只能有两个端点&#xff0c;每一条TCP连接只能是点对点的&#xff08;一对一&#xff09;可靠的&#xff1a…

产品经理与产品原型

点击下载《产品经理与产品原型》 1. 前言 互联网产品经理在向技术部门递交产品策划方案时,除了详尽的需求阐述,一份清晰易懂的产品原型设计方案同样不可或缺。一份出色的原型设计,不仅能促进前期的深入讨论,更能让美工和开发人员更直观地理解产品特性,进而优化工作流程,…

Flutter iOS上架指南

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

NoSQL之 Redis配置

目录 关系数据库与非关系型数据库 关系型数据库&#xff1a; ●非关系型数据库 关系型数据库和非关系型数据库区别&#xff1a; &#xff08;1&#xff09;数据存储方式不同 &#xff08;2&#xff09;扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 Redis简介…

如何快速入门TensorFlow

要快速入门TensorFlow&#xff0c;可以按照以下步骤进行&#xff1a; 学习基本概念&#xff1a;先了解TensorFlow的基本概念&#xff0c;例如张量&#xff08;tensor&#xff09;、计算图&#xff08;computation graph&#xff09;和操作&#xff08;operation&#xff09;等。…

Mongodb中一个小巧的数据更新命令$inc

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第55篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。 $inc是一个很小巧的命令。说它小巧&#xff0c;一个是因为短&#xff0c;只有三个字符。另一个是说…

Python:百度AI开放平台——OCR图像文字识别应用

一、注册百度AI开放平台 使用百度AI服务的步骤为&#xff1a; 注册&#xff1a;注册成为百度AI开放平台开发者&#xff1b;创建AI应用&#xff1a;在百度API开放平台上创建相关类型的的AI应用&#xff0c;获得AppID、API Key和Secret Key&#xff1b;调用API&#xff1a;调用…

渗透测试:数据库UDF提权(linux)

目录 开头: 1.UDF提权简介&#xff1a; 1.1共享库文件(UDF文件)指定目录&#xff1a; 版本特征&#xff1a; 操作系统版本&#xff1a; 2.靶场UDF提权复现 提权前提 1.要有一个高权限的MySQL的账号 ​编辑 2.MySQL的权限配置secure_file_priv为空 3.必须有存放UDF文件的…

PHP8.3-ZTS版本安装流程以及添加扩展

下载php-8.3.x.tar.gz至服务器并解压 [rootapisix-test php-8.3.4]# wget https://www.php.net/distributions/php-8.3.4.tar.gz进入目录执行编译命令&#xff0c;必须要带 --enable-zts 才能激活zts功能 [rootapisix-test php-8.3.4]# ./configure --prefix/usr/local/p…

抖音快手直播录屏+无水印下载视频V3.6

抖音快手直播录屏无水印下载视频更新最新版本V3.6 下载&#xff1a;https://download.csdn.net/download/m0_66047725/88978976 更多资源下载&#xff1a;关注我。

Stable Diffusion WebUI 附加功能/图片放大(Extras):单张图片/批量处理/从目录进行批量处理

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 篇文章主要讲解 Stable Diffusion WebUI 的附加功能/图片放大&#xff08;Extras&#xff09;的使用&#xff0c;主要…

[ruby on rails] ruby使用vscode做开发

ruby LSP实现 ruby插件推荐用这个来实现&#xff0c;但是现在这个在加载文件索引时候&#xff0c;特别慢&#xff0c;时好时坏&#xff0c;所以现在推荐用Solargraph实现 ruby LSP要求ruby版本3以上&#xff0c;如果在旧版本中使用&#xff0c;需要指定bundleGemfile路径 旧版…

1-31 正则表达式 String Buffer String Builder

一.作用:判断指定的String类型值 是否符合指定的规则存储的公式,正确规则表达式 二.为了避免发开中存在差异,Java提出了一些指定的字符,进行正则的编写 符号含义^行起始符 (实际开发中不常用)$行结束符(实际开发中不常用)[]表示某一个位置 , 当且仅当该位置上只有一种可能 []…

量化交易入门(三十八)CCI指标Python实现和回测

今天我们先单纯用CCI指标来完成策略的编写&#xff0c;后续我们会改进这个策略&#xff0c;将CCI指标和前面讲到的MACD和RSI相结合来优化&#xff0c;看看我们优化后的效果会不会更好。 一、量化策略 CCI指标在量化交易中的策略&#xff1a; 在以下情况下生成买入信号&#…

预处理指令——一些比较少见的概念

前言&#xff1a;预处理是我们的c语言源代码成为可执行程序的第一个步骤。而宏和预处理指令都是在这个阶段完成。本节内容就是关于宏和预处理指令相关知识点的解析。 目录 宏 预定义符号 #define定义常量 #define定义符号 #define定义宏 带副作用的宏参数 宏的替换规则…