碎碎念
使用vnet时遇到服务器重启总是需要手动去启动一次,作为需要的常用软件,他应该去自启动。然后了解到了systemd,才发现之前的vnet一键脚本写的有多简(la)单(ji)。不过没关系,我们试着逐步完善他。使用systemd代替nohup实现软件启动与运行。然后记录一下自己学习的过程并逐步完善脚本
正文
来一段介绍
Systemctl是一个systemd工具,主要负责控制systemd系统和管理系统服务
systemd即为system daemon,是linux下的一种init软件
有时我们将自定义程序注册为systemd service 进程管理交由系统管理,可以方便启动停止,亦可以实现
服务异常退出重启,开机自启动。 减少自定义程序服务管理的时间消耗。
将二进制文件放到指定目录
我在/usr/local下创建一个vnet目录并进入该目录
cd /usr/local
mkdir vnet
cd vnet
将vnet文件下载至该目录
如果没有unzip需要先安装unzip
yum -y install zip unzip
wget -N --no-check-certificate "https://www.yunyiya.com/download/linux/tunnel.zip" && unzip tunnel.zip
赋予可执行权限
chmod +x *
创建需要的启动文件和配置文件
这里发现需要在该目录下运行才能启动网页访问,具体原理不理解,后续再补充吧。
这里以服务端为例创建两个文件:server.sh
和server.conf
使用vi编辑器
vi server.sh
按i
进入编辑模式,输入以下内容(第一行为必须)
#!/bin/bash
sleep 0.5
cd /usr/local/vnet
./server
也就是定义文件类型。切换到软件目录再执行server文件,conf文件填入如下内容:
#!/bin/bash
sleep 2
给该文件权限
chmod +x server.sh service.conf
我们去创建systemd文件
谷歌告诉我在下面这个目录,或许吧。。。
cd /usr/lib/systemd/system
我们给他起名字就叫vnets吧s代表server(服务)
vi vnets.service
填入如下内容
[Unit]
Description=VnetServer.Service
After=rc-local.service
[Service]
Type=simple
ExecStart=/usr/local/vnet/server.sh
ExecStartPost=/usr/local/vnet/server.conf
Restart=always
LimitNOFILE=512000
LimitNPROC=512000
[Install]
WantedBy=multi-user.target
使用systemd启动/关闭/开机自启
启动服务:systemctl start vnets
关闭服务:systemctl stop vnets
重启服务:systemctl restart vnets
显示服务的状态:systemctl status vnets
在开机时启用服务:systemctl enable vnets
结束了,下面的还没写完呢
systemd具体参数:
[Unit]
Description 服务描述,作为systemctl status 命令输出的一个介绍
Documentation 一个url 定义服务的具体介绍网址
After 在什么服务启动之后
Before 在什么服务启动之前启动
Requires 依赖其他的单元服务, 需要与列出的服务一起激活,若任何服务无法启动,则该单元不会被激活
Wants 比Requires依赖性弱,弱其他服务没有启动成功,该服务也不受影响,只是表示一种推荐
[Service]
Type
1.simple默认参数,进程作为主进程
2.forking是后台运行的形式,主进程退出,os接管子进程
3.oneshot 类似simple,在开始后续单元之前,过程退出
4.DBUS 类似simple,但随后的单元只在主进程获得D总线名称之后才启动
5.notify 类似simple,但是随后的单元仅在通过sd_notify()函数发送通知消息之后才启动
6.idle类似simple,服务二进制文件的实际执行被延迟到所有作业完成为止,不与其他服务的输出相混合,如状态输出与服务的shell输出混合
备注:以上的类似simple指的是类似simple将启动进程作为主进程进行运行
User
设置服务运行的用户,
Group
设置服务运行的用户组,
PIDFile
为存放PID的文件路径, 对于type设置为forking建议使用该项。 systemd will read
the PID of the main process of the daemon after start-up of the service. systemd will not write to the file configured here,
although it will remove the file after the service has shut down if it still exists.
ExecStart
服务的具体运行命令,ExecStartPre和ExecStartPost指定在ExecStart前后执行的自定义命令。
若使用Type = OnHead可以指定多个自定义命令,将依次执行这些命令。
ExecReload
为重启命令,重新加载的动作, 重新加载时执行的命令或者脚本
ExecStop
为停止命令,停止时要执行的命令或脚本
ExecStartPre:启动服务之前执行的命令
ExecStartPost:启动服务之后执行的命令
ExecStopPost:停止服务之后执行的命令
Restart
定义何种情况Systemd会自动重启当前服务,值:
包括always(总是重启)、no 、on-success、on-failure、on-abnormal、on-abort、on-watchdog
对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal
列出systemd常用命令,我们将其命名为vnets
启动服务:systemctl start
关闭服务:systemctl stop
重启服务:systemctl restart
显示服务的状态:systemctl status
在开机时启用服务:systemctl enable
在开机时禁用服务:systemctl disable
查看服务是否开机启动:systemctl is-enabled
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed