cd /usr/lib/systemd/system/
sudo nano web_start.service
# 进入目录,编辑文件写入服务, unit 服务器说明, ExecStart 启动的内容
[Unit] Description=start web [Service] Type=forking ExecStart=/datadisk/eisc/server/shell/start.sh ExecReload=/bin/kill -SIGHUP $MAINPID ExecStop=/bin/kill -SIGINT $MAINPID [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl disable web_start.service
sudo systemctl enable web_start.service
# 重载配置, 先删web除开机启动 ,再添加 服务
sudo mkdir -p /datadisk/eisc/server/shell/ ; cd /datadisk/eisc/server/shell/
sudo chown root:root start.sh ; sudo chmod 777 start.sh
sudo nano /datadisk/eisc/server/shell/start.sh
#!/bin/bash # bash 解释器 一定要在第一行 开头写,否则下面脚本不执行,开机启动不成功。 由于是 service服务,因此此脚本是 root 用户执行 /bin/nginx /bin/php-fpm # 可以后台启动: /bin/php-fpm &
#---------------------------------------------- 其他备份 忽略 ------------------------------------------------------#
# 重启服务器生效
[root@wwweisccn ~]# cat /usr/lib/systemd/system/eisc-logdata.service
[Unit]
# 服务描述
Description=eisc logdate
# 在网络初始化之后启动
After=network.target
[Service]
# 服务类型
Type=forking
# 类型1:oneshot:程序执行完成就自动结束了,没有后台进程,比如执行一个shell
# 类型2:forking:需要一个后台守护进程一直在运行,比如运行nginx、apache、sshd
# https://blog.csdn.net/seaship/article/details/108235858
# 守护进程:http://www.gosanye.com/post/3755.html
# 进程退出立即重启
Restart=always
RestartSec=5
# 服务每5秒重新启动一次
StartLimitInterval=0
# 工作目录
WoringDirectory=/root/eisc
# 启动命令
ExecStart=/root/eisc/date.sh
[Install]
# 当系统以多用户方式启动时,这个服务需要被自动运行
WantedBy=multi-user.target
cat /usr/lib/systemd/system/eisc-anfang.service
[Unit]
# 服务描述
Description=eisc anfang
# 在网络初始化之后启动
#After=network.target remote-fs.target nss-lookup.target
After=auditd.service systemd-user-sessions.service time-sync.target
[Service]
#Type=forking
# 保留一个守护进程,持续运行,会报错,不加这个参数。
#PrivateTmp=true
# 工作目录
WoringDirectory=/eisc/anfang
# 启动命令
ExecStart=/eisc/anfang/ip.sh
RestartSec=30s
# 重启服务, 无效,
# 需要在脚本里面自己加 无限循环,保持运行生命
[Install]
# 当系统以多用户方式启动时,这个服务需要被自动运行
WantedBy=multi-user.target
#----------- 加入开机启动 ------#
sudo systemctl enable eisc-anfang.service
systemctl start eisc-logdata.service # 启动服务
systemctl enable eisc-logdata.service # 加入开机启动
systemctl disable eisc-logdata # 取消开机启动
systemctl status eisc-logdata # 查看改服务的状态
#--------------------------------- nginx 服务案例 --------------------------------------#
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#-------------------------------------------------------------------------------------#
开机启动服务编写
进入目录 cd /etc/systemd/system/
1:编写属于自己的unit文件,命令为mybash.service,整个文件如下
这边以mybash开机运行为例:
1.建立服务文件
1、vim /lib/systemd/system/mybash.service
文件内容如下:
[Unit]
Description=mybash
# [dɪ ˈs k rɪ p ʃn] di s k lui p xin 服务的简单描述
After=network.target
# 依赖,仅当依赖的服务启动之后再启动自定义的服务单元
# Documentation : 服务文档
[Service]
Type=forking
# Type : 启动类型simple、forking、oneshot、notify、dbus
# Type=forking 以 fork 方式从父进程创建子进程,创建后父进程会立即退出
ExecStart=/etc/nginx start
# 启动当前服务的命令
ExecReload=/etc/nginx restart
# 重启当前服务的命令
ExecStop=/etc/nginx stop
# 停止服务
PrivateTmp=true
#ExecStart # 启动当前服务的命令
#ExecStartPre # 启动当前服务之前执行的命令
#ExecStartPost # 启动当前服务之后执行的命令
#ExecReload # 重启当前服务时执行的命令
#ExecStop # 停止当前服务时执行的命令
#ExecStopPost # 停止当其服务之后执行的命令
[Install]
WantedBy=multi-user.target
################################# 参考资料和说明 ##################################
#---------- [Unit] ----------#
# 配置文件的第一个区块
Description # 简短描述
Documentation # 文档地址
Requires # 当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
Wants # 与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
BindsTo # 与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
Before # 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
After # 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
Conflicts # 这里指定的 Unit 不能与当前 Unit 同时运行
Condition... # 当前 Unit 运行必须满足的条件,否则不会运行
Assert... # 当前 Unit 运行必须满足的条件,否则会报启动失败
[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。
WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias:当前 Unit 可用于启动的别名
Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit
[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。
Type:定义启动时的进程行为。它有以下几种值。
Type=simple:默认值,执行ExecStart指定的命令,启动主进程
Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
Type=dbus:当前服务通过D-Bus启动
Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle:若有其他任务执行完毕,当前服务才会运行
ExecStart:启动当前服务的命令
ExecStartPre:启动当前服务之前执行的命令
ExecStartPost:启动当前服务之后执行的命令
ExecReload:重启当前服务时执行的命令
ExecStop:停止当前服务时执行的命令
ExecStopPost:停止当其服务之后执行的命令
RestartSec:自动重启当前服务间隔的秒数
Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
Environment:指定环境变量