电脑装配网

systemctl启动脚本的编写

 人阅读 | 作者lilintao | 时间:2023-08-04 17:39

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


文章标签:

本文链接:『转载请注明出处』