使用systemd实现开机自动启动服务(或执行脚本/命令)

先编写脚本代码
[root@localhost ~]# vim /service/shell/demo.service.sh
#!/usr/bin/env bash
touch /tmp/demo.service.`date +"%Y%m%d%H%M%S"`.log

[root@localhost ~]#
 
 
 
建立.service文件
[root@localhost ~]# vim /etc/systemd/system/demo.service
[Unit]
Description=这是demo.service的描述
After=network.target remote-fs.target

[Service]
Type=forking

User=用户名
Group=组名
ExecStart=/service/shell/demo.service.sh
 
[Install]
WantedBy=multi-user.target

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable demo.service # 设置开机启动
说明:这样每次启动系统都会在/tmp/目录下生成一个demo.service.yyyymmddhhmmss.log文件。
 
 

服务管理命令
-------------------------
启动服务:systemctl start demo.service
停止服务:systemctl stop demo.service
重启服务:systemctl restart demo.service
查看运行状态:systemctl status demo.service
设置开机自启动:systemctl enable demo.service
取消开机自启动:systemctl disable demo.service
 
 
 
[Unit]节点配置项说明
Description=主要是填写一些信息,用于当前服务的简单描述
Documentation=可以用来指定文档的位置,用于当前服务文档查询
After=可以指定在哪些服务之后进行启动
Before=可以指定在哪些服务之前进行启动
Wants=可以指定服务依赖于哪些服务(这种依赖是“弱依赖”,即使所依赖的服务的启动情况不影响当前的服务是否启动)
Requires=可以指定服务依赖于哪些服务(这种依赖是“强依赖”,一旦所依赖的服务异常,当前的服务也随之停止)
 
[Service]节点配置项说明
EnvironmentFile=用来指定当前服务启动的环境变量,以路径的形式在文件中用key=value的形式写入,读取时可以使用$key来读取
ExecStart=指定服务启动时执行的命令
ExecStop=指定服务停止时执行的命令
ExecReload=指定服务重启时执行的命令
ExecStartPre=指定服务启动之前执行的命令
ExecStartPost=指定服务启动之后执行的命令
ExecStopPost=指定服务停止之后执行的命令
RestartSec=指定服务在重启前等待的时间,单位:秒
Type=指定启动类型,可选值见“Type配置项可选值”
User=指定运行服务的用户,一般缺省即可,除非是像Elasticsearch这种禁止以root用户运行服务的才需要指定
Group=指定运行服务的组,一般缺省即可,除非是像Elasticsearch这种禁止以root用户运行服务的才需要指定
Restart=指定重启时的类型,可选值见“Restart配置项可选值”
KillMode=指定停止的方式,可选值见“KillMode配置项可选值”
 
[Install]节点配置项说明
WantedBy=该服务所在的Target,一般写multi-user.target即可
 
 
 
Type配置项可选值:
simple:指定ExecStart字段的进程为主进程,对于不会产生守护进程(即在前台运行服务)的脚本可以使用该值
forking:指定以fork()子进程执行ExecStart字段的进程,对于会产生守护进程(即在后台运行服务)的脚本可以使用该值
oneshot:执行一次,对于不会产生守护进程(即在前台运行服务)的脚本可以使用该值
notify:启动后发送会发送通知信号通知systemd
idle:等其他任务结束后才运行
 
Restart配置项可选值:
no:退出后不会重启
on-success:当进程正常退出时(退出码为0)执行重启
on-failure:当进程不正常退出时(退出码不为0)执行重启
on-abnormal:当被信号终止和超时执行重启
on-abort:当收到没有捕捉到的信号终止时执行重启
on-watchdog:当看门狗超时时执行重启
always:一直重启
 
KillMode配置项可选值:
control-group:杀掉当前进程中所有的进程
process:杀掉当前进程的主进程
mixed:主进程将收到SIGTERM信号,子进程收到SIGKILL信号
none:不杀掉任何进程
 
 
 
systemd不仅可以实现开机自动执行脚本或命令,还能实现管理系统服务(包括启动、停止、重启等),虽然用chkconfig也能实现管理系统服务,但systemd强大的地方在于不需要管理员去写管理系统服务的全部shell代码,而chkconfig则需要管理员自己去写shell代码实现启动、关闭、重启等相关管理功能,下面以实现systemd管理TCP服务为例展示核心代码:
 
 
 
先编写脚本代码
[root@localhost ~]# vim /service/shell/swoole_tcp_server.sh
#!/usr/bin/env bash
 
########## 以下变量根据实际情况修改·开始 ##########
php='/program/php/bin/php'
script='TCP服务端PHP脚本的硬盘路径'
########## 以下变量根据实际情况修改·结束 ##########
 
# 参数$1可能值:start、stop、restart
operation=$1
 
case $operation in
'start')
echo '即将启动TCP服务器' >>/service/shell/service.log
 
# 执行PHP脚本,不管脚本代码有没有设定守护进程和运行过程有没有输出,这里用命令强制设为在后台运行且屏蔽所有输出
nohup $php $script >/dev/null 2>&1 &
;;
'stop')
echo '即将停止TCP服务器' >>/service/shell/service.log
;;
'restart')
echo '即将重启TCP服务器' >>/service/shell/service.log
;;
*)
echo "未知操作“{$operation}”。" >>/service/shell/service.log
;;
esac

[root@localhost ~]#
 
 
 
建立.service文件
[root@localhost ~]# vim /etc/systemd/system/tcp.service
[Unit]
Description=TCP服务
After=network.target remote-fs.target

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/service/shell/swoole_tcp_server.sh start
ExecStop=/service/shell/swoole_tcp_server.sh stop
ExecReload=/service/shell/swoole_tcp_server.sh restart
 
[Install]
WantedBy=multi-user.target

[root@localhost ~]#

Copyright © 2024 码农人生. All Rights Reserved