Ubuntu下的自启动(Service启动)

这篇具有很好参考价值的文章主要介绍了Ubuntu下的自启动(Service启动)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Ubuntu中设置Python3命令开机自启需要创建一个systemd service文件,步骤如下:

  1. 使用任一文本编辑器,打开一个终端窗口。

  2. 在终端中输入以下命令,创建一个.service文件:

sudo vim /etc/systemd/system/my_script.service
  1. 在打开的文件中输入以下代码:
[Unit]
Description = Supervisor Application

[Service]
User = root
Type = forking
ExecStart = /env/bin/supervisord -c /app/supervisor/supervisord.conf
ExecStop= /env/bin/supervisorctl shutdown
ExecReload= /env/bin/supervisorctl reload
KillMode = process
Restart = on-failure
RestartSec = 42s

[Install]
WantedBy = multi-user.target

其中,my_script.service是服务名称,我的Python脚本在 /path/to/my/script.py,可以根据自己的情况进行修改。

编写服务配置 
每一个服务以.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-watchdog

no(默认值):退出后不会重启;
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)时,会被同时激活的其他 Unit

Linux 缓和的执行进程关闭,然后重启。在对配置文件修改后需要重启进程时可发送此信号。

*.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 list

Wants=network-online.target

After=network.target

[Service]

Type=oneshot

RemainAfterExit=yes

ExecStart=/sbin/arp -f /etc/ip-mac

ExecReload=/sbin/arp -f /etc/ip-mac

ExecStop=/sbin/arp -d -a

[Install]

WantedBy=multi-user.target

  1. 保存文件并退出编辑器。

  2. 重新加载系统守护程序:

sudo systemctl daemon-reload
  1. 启用和启动服务:
sudo systemctl enable my_script.service
sudo systemctl start my_script.service

7.现在你的服务应该会在开机时自动启动。你可以检查服务状态和日志以确保它正在正常运行:


sudo systemctl status my_script.service
sudo journalctl -u my_script.service -f

现在,Python脚本将自动启动并在系统重新启动后开机自启动。

你可以使用以下命令来关闭systemd服务:

sudo systemctl stop my_script.service

这将会停止 my_script.service 服务,使它不再在后台运行。如果你希望服务在下次开机时也不再自动启动,可以使用以下命令禁用它:文章来源地址https://www.toymoban.com/news/detail-490953.html

sudo systemctl disable my_script.service

到了这里,关于Ubuntu下的自启动(Service启动)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git 命令行教程及实例教程,Service有几种启动方式

    切换回主分支: git checkout master 切换回分支: git checkout git checkout feature_x 再把新建的分支删掉: git branch -d feature_x 除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的: git push origin git push origin feature_x 更新与合并 要更新你的本地仓库至最新改动,执行: git pu

    2024年04月17日
    浏览(37)
  • Python3.9环境下的dlib安装流程与错误解决

    环境:windows10、Python3.9(Anaconda3)、Pycharm2018.3、 1.尝试在Pycharm中直接安装dlib库,失败  2.尝试在Anaconda中安装,打开Anaconda Prompt  在其中输入pip install dlib,报错,未安装Cmake 3.继续安装Cmake与boost,pip install cmake,pip install boost 4.换了豆瓣源,再次尝试pip install dlib  -i https://

    2024年02月03日
    浏览(69)
  • C语言-ubuntu下的命令

    目录 linux命令 【1】打开关闭终端 【2】终端 【3】ls命令 【4】cd 切换路径 【5】新建 【6】删除 【7】复制 【8】移动 【9】常用快捷键 【10】vi编辑器 【11】简单编程步骤 任务: 【1】打开关闭终端 打开终端: 1. 直接点击 2. ctrl alt t : 在家目录下打开终端 3. ctrl shift n :在当前

    2024年02月16日
    浏览(34)
  • python webdriver之find_element(python3.10版本下的变化)

    最近在用python练习,3.10版本下的python使用webdriver时,在百度各论坛或CSDN里,查到的获取元素方法都是 find_element_by_XX,比如 但是在这个版本的python里,每次这样使用都会报错说没有这种函数,在实验很多次之后发现,现在只能用 find_element(by=\\\'\\\',value=\\\'\\\') 其中by里可以是id、na

    2024年02月12日
    浏览(46)
  • ruoyi启动前端报错‘vue-cli-service‘ 不是内部或外部命令

    解决方案: 在新项目的pack.json的文件目录,执行命令npm install 或者 cnpm install 如果报npm 不是内部命令,需要在系统配置全局的变量 在使用npm的时候,或者是通过npm下载了一些包,使用这些包的时候,有时候会遇到“npm 不是内部或外部命令”,或者“XXX 不是内部或外部命令

    2024年02月05日
    浏览(52)
  • Ubuntu环境下的Tomcat服务器安装及其自启动配置

    仅供自己记录所用 1、 Tomcat 下载与安装         注意:在安装tomcat之前需要安装Java,JDK                 首先到官网下载安装包:Apache Tomcat® - Welcome! 下载到/usr/local/tomcat/下面并解压:tar -zxvf apache-tomcat-8.5.87.tar.gz 接下来就是给Tomcat文件添加使用权限:sudo chmod 755 -R apa

    2024年02月02日
    浏览(74)
  • 复习第一课 C语言-ubuntu下的命令

    目录 linux命令 【1】打开关闭终端 【2】终端 【3】ls命令 【4】cd 切换路径 【5】新建 【6】删除 【7】复制 【8】移动 【9】常用快捷键 【10】vi编辑器 【11】简单编程步骤 任务: 【1】打开关闭终端 打开终端: 1. 直接点击 2. ctrl alt t : 在家目录下打开终端 3. ctrl shift n :在当前

    2024年02月16日
    浏览(38)
  • ubuntu上升级python从python3.7到python3.8

    注意 :这里要注意2中前面的地址根据 which python3.8 来的

    2024年02月13日
    浏览(45)
  • Ubuntu 18.04 升级 Python3;以Python3.8为例

    Ubuntu 18.04 默认的Python3版本为Python3.6,我们想将其升级为Python3.8. Python3升级后会 破坏原先Ubuntu系统上的某些Python3依赖 ,升级前请 务必考虑清楚 。遇到问题后,可以参考文末方法解决。 以所有普通用户或root用户,在 终端或脚本 中运行python3时,会运行python3.8解释器 以所有普

    2024年02月07日
    浏览(46)
  • 启动Vue项目,报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序

    前言: 最近在打开一个Vue项目的时候,打开之后输入命令行:npm run serve之后发现, 报错:vue-cli-service\\\' 不是内部或外部命令,也不是可运行的程序, 以下是解决方案: 报错图片截图: 1.打开package.json配置文件 先查看自己的命令行有没有错,然后检查是否有vue-cli-service, 如

    2024年01月16日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包