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配置知识页面中的内容,内容比较详尽。