当前位置:   article > 正文

Ubuntu 自启动应用程序的方法_ubuntu20自启动程序怎么配置

ubuntu20自启动程序怎么配置

1、自启动的方法

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

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

2、自行编写一个服务

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

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

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

  1. eiota@firefly:/lib/systemd/system$ cat zsm_test.service
  2. [Unit]
  3. Description=zsm test Service
  4. #在网络启动后
  5. After=network.target
  6. [Service]
  7. Type=simple
  8. ExecStart=/home/eiota/test.py
  9. #程序意外退出, 延时2秒自动重启
  10. RestartSec=2
  11. Restart=always
  12. [Install]
  13. #允许多个用户
  14. 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       禁止服务。后面设备再开机就不自动启动了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/711688
推荐阅读
相关标签
  

闽ICP备14008679号