Centos 7自定义Service实现自启动

Centos 7自定义Service实现自启动

  工作当中用到了gerrit服务器,安装配置好后,没有设置为开机自启动,在经历一次又一次的停电导致服务中断,然后不得不人工介入恢复服务的惨痛过程之后,决定必须实现开机自启动,摆脱这个痛苦的过程。

一、确定采用Service的方案

  多方比较之后,决定采用systemctl系统命令操作的service方案,服务目标文件目录如下:

/usr/lib/systemd/system

  参考linux centos7 开机自启动里面的内容看到了两个service样例,分别是下面的nginx和mysql例子,参照编写了后面的gerrit样例。
nginx.service

[Unit]
Description=nginx - high performance web 
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target

mysql.service

[Unit]
Description=mysql
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking 
ExecStart=/usr/local/mysql/support-files/mysql.server start
#ExecReload=/usr/local/mysql/support-files/mysql.server restart
#ExecStop=/usr/local/mysql/support-files/mysql.server stop
#PrivateTmp=true

[Install]
WantedBy=multi-user.target

gerrit.service

[Unit]
Description=gerrit
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/bin/bash -c "/home/gerrit/review_site/bin/gerrit.sh start &"
ExecReload=/bin/bash -c "/home/gerrit/review_site/bin/gerrit.sh restart &"
ExecStop=/bin/bash -c "/home/gerrit/review_site/bin/gerrit.sh stop &"
PrivateTmp=true

[Install]
WantedBy=multi-user.target

二、踩坑经过说明

  上面展示的gerrit.serive是最终的版本,实际上,最开始的版本是这样的:

[Unit]
Description=gerrit
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/home/gerrit/review_site/bin/gerrit.sh start
ExecReload=/home/gerrit/review_site/bin/gerrit.sh restart
ExecStop=/home/gerrit/review_site/bin/gerrit.sh stop

[Install]
WantedBy=multi-user.target

  调用命令systemctl start gerrit尝试启动服务,使用命令journalctl -u gerrit发现一个奇怪的现象,每次都是先触发gerrit.sh start,然后触发gerrit.sh stop,结果最后服务启动失败,不能正常提供服务。尝试了调整Service里面的Type参数,也尝试添加PrivateTmp参数,都没有效果。想来想去,考虑到gerrit.sh start命令耗时较长,有可能是服务启动超时了,于是在网上搜索相关内容,最后终于在systemd systemctl ExecStart超时处理页面内容中找到了解决方案。解决方案就是使用“bash -c”的调用方式,bash -c的作用是将一个长字符串当做一条完整的命令来执行,如果在脚本路径后面加上后台运行符号(&),则目标脚本就会在后台运行,不会一直处于挂起状态,systemd也就不会一直等待目标脚本执行完成了,实际使用样例如下:

ExecStart=/bin/bash -c "/home/gerrit/review_site/bin/gerrit.sh start &"

三、其他说明

1.服务相关命令

systemctl start gerrit.service           # 启动服务
systemctl restart gerrit.service         # 重新启动服务
systemctl stop gerrit.service            # 停止服务
systemctl enable gerrit.service          # 设置开机自启动
systemctl disable gerrit.service         # 停止开机自启动
systemctl status gerrit.service          # 查看服务当前状态
systemctl list-units --type=service      # 查看所有已启动的服务

2.查看服务日志

journalctl -u gerrit

3.服务配置文件字段详解

  配置字段详解,可参考链接Centos7下service配置知识页面中的内容,内容比较详尽。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值