• 如何在Systemd中使用Shell脚本创建和运行新的服务


    本文介绍在systemd中一个"service unit"是什么,要创建和运行一个"service unit"多简单。我尝试简化"targets"是什么,为什么我们称它们"collections of units"并且它们的"wants"是什么。最后我们利用一个服务单元在系统系统过程后运行我们自己的脚本。

    很明显因为你计算机提供的服务,所以它是有用的,并且为了有这个功能,当计算机启动并且到达了不同级别,必须调用很多服务。当计算机到达了例如救援级别(runlevel 0)时,调用执行其它服务,而当它达到多用户级别时(runlevel 3)时,调用执行其它服务。你可以设想这些级别为targets。

    用一个简单方式,目标是一个服务单元的集合。如果查看在你的multi-user级别中运行的服务单元,输入:

    1. [root@telecom ~]# systemctl --type=service
    2. UNIT LOAD ACTIVE SUB DESCRIPTION
    3. auditd.service loaded active running Security Auditing Service
    4. ...
    5. rpcbind.service loaded active running RPC bind service
    6. rsyslog.service loaded active running System Logging Service

    如你所见,我检查了smb.service的状态(提示:你可以使用服务名称自动补全)。它告诉我smb服务一直运行并且它被启用了:

    1. [root@telecom ~]# systemctl status smb.service
    2. ● smb.service - Samba SMB Daemon
    3. Loaded: loaded (/usr/lib/systemd/system/smb.service; enabled; vendor preset: disabled)
    4. Active: active (running) since Sun 2022-08-28 17:34:33 CST; 15h ago
    5. Docs: man:smbd(8)
    6. man:samba(7)
    7. man:smb.conf(5)
    8. Main PID: 1162 (smbd)
    9. Status: "smbd: ready to serve connections..."
    10. CGroup: /system.slice/smb.service
    11. ├─1162 /usr/sbin/smbd --foreground --no-process-group
    12. ├─1363 /usr/sbin/smbd --foreground --no-process-group
    13. ├─1364 /usr/sbin/smbd --foreground --no-process-group
    14. └─1378 /usr/sbin/smbd --foreground --no-process-group
    15. Aug 28 17:34:32 telecom systemd[1]: Starting Samba SMB Daemon...
    16. Aug 28 17:34:33 telecom smbd[1162]: [2022/08/28 17:34:33.115547, 0] ../../lib/util/become_daemon.c:136(daemon_ready)
    17. Aug 28 17:34:33 telecom systemd[1]: Started Samba SMB Daemon.
    18. Aug 28 17:34:33 telecom smbd[1162]: daemon_ready: daemon 'smbd' finished starting up and ready to serve connections

    启用和禁用各自表示这个服务将是否在下次系统启动过程中被永久装载。零一方面,启动或停止一个服务具有当前会话的限制并且它不是永久的。

    例如,如果你输入:

    1. [root@telecom ~]# systemctl stop smb.service
    2. [root@telecom ~]# systemctl status smb.service
    3. ● smb.service - Samba SMB Daemon
    4. Loaded: loaded (/usr/lib/systemd/system/smb.service; enabled; vendor preset: disabled)
    5. Active: inactive (dead) since Mon 2022-08-29 09:02:57 CST; 10s ago
    6. Docs: man:smbd(8)
    7. man:samba(7)
    8. man:smb.conf(5)
    9. Process: 1162 ExecStart=/usr/sbin/smbd --foreground --no-process-group $SMBDOPTIONS (code=killed, signal=TERM)
    10. Main PID: 1162 (code=killed, signal=TERM)
    11. Status: "smbd: ready to serve connections..."
    12. Aug 28 17:34:32 telecom systemd[1]: Starting Samba SMB Daemon...
    13. Aug 28 17:34:33 telecom smbd[1162]: [2022/08/28 17:34:33.115547, 0] ../../lib/util/become_daemon.c:136(daemon_ready)
    14. Aug 28 17:34:33 telecom systemd[1]: Started Samba SMB Daemon.
    15. Aug 28 17:34:33 telecom smbd[1162]: daemon_ready: daemon 'smbd' finished starting up and ready to serve connections
    16. Aug 29 09:02:57 telecom systemd[1]: Stopping Samba SMB Daemon...
    17. Aug 29 09:02:57 telecom systemd[1]: Stopped Samba SMB Daemon.

    你可以看到smb.services是不活跃的(dead),但它仍然是启用的,这表示在下次系统启动中,它将被装载。所以如果我们想要以后再系统启动时一个服务被装载,我们必须启用它。让我们创建一个,它是简单的。

    如果我们进入这个文件夹:

    1. [root@telecom system]# cd /etc/systemd/system
    2. [root@telecom system]# ls -l
    3. total 56
    4. drwxr-xr-x. 2 root root 4096 Dec 27 2021 basic.target.wants
    5. drwxr-xr-x. 2 root root 4096 Dec 27 2021 cloud-init.target.wants
    6. -rw-r--r--. 1 root root 266 Dec 27 2021 cloudResetPwdAgent.service
    7. -rw-r--r--. 1 root root 294 Dec 27 2021 cloudResetPwdUpdateAgent.service
    8. lrwxrwxrwx. 1 root root 57 Dec 27 2021 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
    9. lrwxrwxrwx. 1 root root 37 Dec 27 2021 default.target -> /lib/systemd/system/multi-user.target
    10. drwxr-xr-x. 2 root root 4096 Dec 27 2021 default.target.wants
    11. drwxr-xr-x. 2 root root 4096 Dec 27 2021 dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants
    12. drwxr-xr-x. 2 root root 4096 Dec 27 2021 getty.target.wants
    13. drwxr-xr-x. 2 root root 4096 Dec 27 2021 local-fs.target.wants
    14. drwxr-xr-x. 2 root root 4096 Aug 28 23:29 multi-user.target.wants
    15. drwxr-xr-x. 2 root root 4096 Dec 27 2021 network-online.target.wants
    16. drwxr-xr-x 2 root root 4096 Aug 20 19:25 remote-fs.target.wants
    17. drwxr-xr-x 2 root root 4096 Aug 20 19:25 sockets.target.wants
    18. drwxr-xr-x. 2 root root 4096 Dec 27 2021 sysinit.target.wants
    19. drwxr-xr-x. 2 root root 4096 Dec 27 2021 system-update.target.wants

    你可以看到一些单元服务的链接文件和一些一个目录的"wants"的目录。例如,在系统启动过程到达multi-user运行级别时,multi-user目标想要装载什么,在名为/etc/systemd/system/multi-user.target.wants/的目录中被列出。

    1. [root@telecom system]# ls /etc/systemd/system/multi-user.target.wants/
    2. auditd.service irqbalance.service postfix.service rsyslog.service tuned.service
    3. cloudResetPwdAgent.service kdump.service remote-fs.target smb.service webmin.service
    4. cloudResetPwdUpdateAgent.service NetworkManager.service rhel-configure.service sshd.service ypbind.service
    5. crond.service nfs-client.target rpcbind.service testIOC.service

    如你所见,它不但包含了services,还包含了其它targets,其也是services的集合。

    让我们用connect.service创建一个服务单元。

    1. [root@telecom multi-user.target.wants]# cat connection.service
    2. [Unit]
    3. Description = making
    4. After = network.target
    5. [Service]
    6. ExecStart = /root/scripts/conup.sh
    7. [Install]
    8. WantedBy = multi-user.target

    解释以上:我们创建一个service类型的单元(你也可以创建target类的单元),我们设置在network.target后装载它(你能够理解引导过程按一个定义好的顺序达到targets),并且我们想要每次服务启动去执行一个我们将要创建的名为conup.sh的脚本。

    这个功能从最后部分[install]开始。它告诉"multi-user.target"将想要它。所以如果我们启动我们的服务,在multi-user.target.wants文件夹内将创建一个指向那个服务的符号链接。理解码?并且如果我们禁用它,将删除这个链接。

    只要启用它并且检查:

    1. [root@telecom system]# systemctl enable connection
    2. Created symlink from /etc/systemd/system/multi-user.target.wants/connection.service to /etc/systemd/system/connection.service.

    它告诉我们在multi-user.target.wants中已经创建了一个符号链接。检查:

    1. [root@telecom system]# ls -l multi-user.target.wants/connection.service
    2. lrwxrwxrwx 1 root root 38 Aug 29 13:24 multi-user.target.wants/connection.service -> /etc/systemd/system/connection.service

    如你看到"connection.service"已经为下次系统启动做好准备,但我们必须首先创建这个脚本文件。

    1. [root@telecom scripts]# cd /root
    2. [root@telecom scripts]# mkdir scripts
    3. [root@telecom scripts]# cd scripts
    4. [root@telecom scripts]# vim conup.sh
    5. [root@telecom scripts]# cat conup.sh
    6. #!/bin/bash
    7. echo `date` >>/tmp/dates.log

    如果你想要你的脚本执行另外的事情,你可以输入你想要的任何东西替代第二行。

    例如:

    1. [root@telecom scripts]# vim newfile.sh
    2. [root@telecom scripts]# cat newfile.sh
    3. #!/bin/bash
    4. touch /tmp/testbootfile

    其将在/tmp文件夹下创建一个文件(检查你的服务有效)。

    我们也必须使得这个脚本可执行:

    [root@telecom scripts]# chmod +x conup.sh

    现在我们准备好了。如果你不想要等到下次系统启动,我们可以输入以下为当前会话启动这个服务:

    1. [root@telecom scripts]# systemctl start connection
    2. [root@telecom scripts]# cat /tmp/dates.log
    3. Mon Aug 29 13:39:59 CST 2022

    我的脚本已经启动并且运行。

  • 相关阅读:
    ABAP学习笔记之——第八章:报表程序
    Python词频分析
    基于EKF扩展卡尔曼滤波的传感器网络目标跟踪matlab仿真
    图论算法大合集【包括图的dfs和bfs遍历】【欧拉回路】【判断连通图】【Dijkstra算法】【floyd算法】【最小生成树prim算法】【拓扑排序】
    【迪文屏幕】开发资料
    基于混合模型磁链观测器的异步电机矢量控制的学习
    你还只知道404?来看HTTP状态码详解
    如何驱动直流电机H桥驱动笔记
    发挥项目“临时性”威力,让项目顺利实施
    车路协同 智能路侧决策系统边缘计算系统功能技术要求
  • 原文地址:https://blog.csdn.net/yuyuyuliang00/article/details/126577699