ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

在Linux创建开机自启动服务

2022-04-11 15:00:23  阅读:249  来源: 互联网

标签:systemd 服务 service 开机 systemctl 设置 Linux 自启动 Type


参考一

创建一个脚本或者使用可执行文件,本文以一个test.bash脚本为例:

DATE=`date '+%Y-%m-%d %H:%M:%S'`
echo "Example service started at ${DATE}"
while :
do
echo "...";
sleep 1000;
done

使该脚本具有可执行权限:

sudo chmod +x /usr/bin/test.sh

进入/etc/systemd/system/,创建一个名为testservice.service的Unit file来定义一个systemd服务

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/usr/bin/zsh ~/.local/bin/test.sh

[Install]
WantedBy=multi-user.target

在命令行输入以下命令启动服务:

sudo systemctl start testservice

使用以下enable命令来确保该服务在系统启动时启动:

sudo systemctl enable testservice

你也可以使用以下systemd命令停止或重新启动该服务:

sudo systemctl stop testservice
sudo systemctl restart testservice

参考二

linux服务管理有两种方式service和systemctl

/lib/systemd/system/和 /etc/systemd/system`存放所有可用的单元文件

手动创建一个开机启动脚本,开机自动执行/home/book/test_qt_whail/server/sh.sh的脚本

  1. 只需要在/lib/systemd/system/ 创建test.service
  2. systemctl daemon-reload 修改服务配置文件后需要
  3. systemctl enable test.service 设置服务开机自启动
  4. systemctl is-enabled postgresql.service 查询是否自启动服务
  5. systemctl disable postgresql.service 取消服务器开机自启动
  6. systemctl list-units --type=service 列出正在运行的服务
#***test.service***
# THIS IS A GENERATED FILE, NOT RECOMMENDED TO EDIT.
 
[Unit]
Description="bringup ros"
After=network.target
 
[Service]
Type=simple
ExecStart=/bin/bash /home/book/test_qt_whail/server/sh.sh
 
[Install]
WantedBy=multi-user.target

文件构成

这个脚本分三个部分 : [Unit] [Service] [Install]

[Unit]

Unit表明该服务的描述,类型描述。我们称之为一个单元。比较典型的情况是单元A要求在单元B启动之后再启 动。这种设置是通过Unit下面的RequiresAfterBeforeWants来调整的。比如上述场景的编写可以这 样(在A中编写):

#A.service
[Unit]
Requires=B
After=B

这个说明了A的启动依赖于B,同时要求在B启动之后启动自己,设置十分简洁。需要注意的是,依赖关系通常在 服务(Service)而不是在(Target)上。

[Service]

Service是脚本的关键部分,这一部分用于设置一些关键参数:

Type=forking: 后台运行模式
PIDFile=/xxx/xxx.xxx : 存放PID文件的位置
ExecStart=/bin/echo xxx : 这是服务运行的具体执行命令
ExecReload=/bin/echo xxx : 这是服务重启的执行命令
EexcStop=/bin/echo xxx : 这是服务停止的执行命令
Service的启动方式,在Service段中,启动方式使用Type指定。具体可以参考man systemd.service

[Service]
Type=simple
ExecStart=/bin/bash /home/book/test_qt_whail/server/sh.sh

值得注意的是,在脚本中关于服务启动、重启、关闭的指令需要使用绝对路径,否则会出现无法识别的情况。

Type有如下几种可选项:

simple 、forking、oneshot、dbus、notify、idel

simple,这是默认的Type,当Type和BusName配置都没有设置,指定了ExecStart设置后,simple就是默认的Type设置。simple使用ExecStart创建的进程作为服务的主进程。在此设置下systemd会立即启动服务,如果该服务要启动其他服务(simple不会forking),它们的通讯渠道应当在守护进程启动之前被安装好(e.g. sockets,通过sockets激活)。
forking,如果使用了这个Type,则ExecStart的脚本启动后会调用fork()函数创建一个进程作为其启动的一部分。当一切初始化完毕后,父进程会退出。子进程会继续作为主进程执行。这是传统UNIX主进程的行为。如果这个设置被指定,建议同时设置PIDFile选项来指定pid文件的路径,以便systemd能够识别主进程。
oneshot,onesh的行为十分类似simple,但是,在systemd启动之前,进程就会退出。这是一次性的行为。可能还需要设置RemainAfterExit=yes,以便systemd认为j进程退出后仍然处于激活状态。
dbus,这个设置也和simple很相似,该配置期待或设置一个name值,通过设置BusName=设置name即可。
notify,同样地,与simple相似的配置。顾名思义,该设置会在守护进程启动的时候发送推送消息(通过sd_notify(3))给systemd。
RemainAfterExit默认值为no,这个设置采用booleean值,可以是0、no、off、1、yes、on等值。它表明服务是否应当被视为激活的,即便当它所有的进程都退出了。简言之,这个设置用于告诉systemd服务是否应当是被视为激活状态,而不管进程是否退出。当为true时,即便服务退出,systemd依然将这个服务视为激活状态,反之则服务停止。
GuessMainPID
采用boolean值指定systemd在无法确切的查明服务的时候是否需要猜测服务的main pid。除非Type=forking被采用并且PIDFile没有被设置,否则这个选项会被忽略。因为当设置为Type的其他选项,或者显示的指定了PID文件后,systemd总是能够知道main pid。
PIDFile采用一个绝对路径的文件名指定守护进程的PID文件。当Type=forking被设置的时候,建议采取这个设置。当服务启动后,systemd会读取守护进程的主进程id。systemd不会对该文件写入数据。
BusName使用一个D-Bus的总线名称,作为该服务的可访问名称。当Type=dbus的时候,该设置被强制使用。
BusPolicy如果该选项被指定,一个自定义的kdbus终结点将会被创建,并且会被指定为默认的dbus节点安装到服务上。这样的自定义终结点自身持有一个策略规则集合。这些规则将会在总线范围内被强制指定。该选项只有在kdbus被激活时有效。
ExecStart当服务启动的时候(systemctl start youservice.service),会执行这个选项的值,这个值一般是“ExecStart=指令 参数”的形式。当Type=oneshot的时候,只有一个指令可以并且必须给出。原因是oneshot只会被执行一次。
ExecStartPre、ExecStartPost顾名思义,这两个设置的意义在于ExecStart被执行之前和之后被执行。
ExecReload服务重启时执行。
ExecStop服务停止时执行。
ExecStopPost服务停止后执行

[Install]

...

service启动失败问题排查

日志分析

查看哪些服务启动失败

 book@100ask:~$ systemctl --failed
    UNIT        LOAD   ACTIVE SUB    DESCRIPTION                                 
  ● ros.service loaded failed failed "bringup ros"                               
  
  LOAD   = Reflects whether the unit definition was properly loaded.
  ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
  SUB    = The low-level unit activation state, values depend on unit type.
  
  1 loaded units listed. Pass --all to see loaded but inactive units, too.
  To show all installed unit files use 'systemctl list-unit-files'.

或查看打印出错的日志

book@100ask:~$ journalctl -fp err
  Hint: You are currently not seeing messages from other users and the system.
        Users in groups 'adm', 'systemd-journal' can see all messages.
        Pass -q to turn off this notice.
  -- Logs begin at Tue 2019-03-26 05:40:55 EDT. --
  7月 30 09:37:15 100ask pulseaudio[1981]: [alsa-sink-ES1371/1] alsa-sink.c: 我们因 POLLOUT 被设置而唤醒 -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可用值的数值

参考链接:https://blog.csdn.net/qq_32261101/article/details/119279438

标签:systemd,服务,service,开机,systemctl,设置,Linux,自启动,Type
来源: https://www.cnblogs.com/weidaijie/p/16130004.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有