systemctl启动脚本的编写
CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/, 有系统(system)和用户(user)之分, 像需要开机不登陆就能运行的程序, 还是存在系统服务里吧, 即:/usr/lib/systemd/system目录下, 脚本要有754的权限
每一个服务以.service结尾, 一般会分为3部分:[Unit]、[Service]和[Install]
脚本的内容格式
[Unit] 服务的说明
Description 描述服务
After 描述服务类别
[Service] 服务运行参数的设置
Type=forking 是后台运行的形式
PIDFile 为存放PID的文件路径
ExecStart 为服务的具体运行命令
ExecReload 为重启命令
ExecStop 为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install] 服务安装的相关设置, 可设置为多用户
附录:
Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务, 不要使用此类型启动, 除非该服务是socket激活型。
Type=forking:systemd认为当该服务进程fork, 且父进程退出后服务启动成功。对于常规的守护进程(daemon), 除非你确定此启动方式无法满足需求, 使用此类型启动即可。
使用此启动类型应同时指定 PIDFile=, 以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同, 但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式启动, 当指定的 BusName 出现在DBus系统总线上时, systemd认为服务就绪。
其他参数
定义环境变量的格式:
[Service]
EnvironmentFile=/etc/sysconfig/sshd
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
指定服务的工作目录。
[Service]
WorkingDirectory=/usr/local/rabbitmq
编写一个httpd 的启动脚本
1. 创建httpd.service 脚本文件
vim /usr/lib/systemd/system/httpd.service
2. 编写脚本内容
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=notify
ExecStart=/usr/local/apache/bin/apachectl start -c /usr/local/apache/conf/httpd.conf
ExecReload=/usr/local/apache/bin/apachectl restart
ExecStop=/usr/local/apache/bin/apachectl stop
[Install]
WantedBy=multi-user.target
编写mysql的启动脚本
1. 创建mysqld.service 脚本文件
vim /usr/lib/systemd/system/mysqld.service
2. 编写脚本内容
[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
编写nginx的启动脚本
1. 创建nginx.service 脚本文件
vim /usr/lib/systemd/system/nginx.service
2. 编写脚本内容
[Unit]
Description=nginx - high performance web server
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
编写php-fpm的启动脚本
1. 创建php-fpm.service 脚本文件
vim /usr/lib/systemd/system/nginx.service
2. 编写脚本内容
[Unit]
Description=php
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/php/sbin/php-fpm
[Install]
WantedBy=multi-user.target
编写使用systemctl启动服务脚本的完整流程
CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/, 有系统(system)和用户(user)之分, 像需要开机不登陆就能运行的程序, 还是存在系统服务里吧,
即:/usr/lib/systemd/system目录下
每一个服务以.service结尾, 一般会分为3部分:[Unit]、[Service]和[Install], 我写的这个服务用于开机运行Node.js项目, 具体内容如下:
> # vim /usr/lib/systemd/system/node.service
#[Unit]部分主要是对这个服务的说明, 内容包括Description和After, Description
#用于描述服务, After用于描述服务类别
[Unit]
Description=xiyoulibapi
After=network.target remote-fs.target nss-lookup.target
#[Service]部分是服务的关键, 是服务的一些具体运行参数的设置, 这里Type=forking
#是后台运行的形式, PIDFile为存放PID的文件路径, ExecStart为服务的具体运行命令,
#ExecReload为重启命令, ExecStop为停止命令, PrivateTmp=True表示给服务分配独立的临时空间;
#注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径, 使用相对路径则会报错!
[Service]
Type=forking
PIDFile=/node.js/pid
ExecStart=/usr/local/bin/forever start /node.js/xiyoulib/bin/www
ExecReload=/usr/local/bin/forever restart /node.js/xiyoulib/bin/www
ExecStop=/usr/local/bin/forever stop /node.js/xiyoulib/bin/www
PrivateTmp=true
#[Install]部分是服务安装的相关设置, 可设置为多用户的
[Install]
WantedBy=multi-user.target
服务脚本按照上面编写完成后, 以754的权限保存在/usr/lib/systemd/system目录下, 这时就可以利用systemctl进行配置了
> # chmod 754 /usr/lib/systemd/system/node.service
重新加载所有单元文件
systemctl daemon-reload
首先, 使用systemctl start [服务名(也是文件名)]可测试服务是否可以成功运行,
> # systemctl start node.service
如果不能运行则可以使用systemctl status [服务名(也是文件名)]查看错误信息和其他服务信息, 然后根据报错进行修改,
直到可以start, 如果不放心还可以测试restart和stop命令。
> # systemctl status node.service
> # systemctl restart node.service
> # systemctl stop node.service
接着, 只要使用systemctl enable [服务名(也是文件名)]就可以将所编写的服务添加至开机启动即可。
> # systemctl enable node.service