一、什么是.service文件?
Linux中.service文件是某项服务对应的配置文件,可用于systemd管理和控制的服务的设置。
二、.service文件内容介绍
.service 文件通常包含3个模块,即:
- [Unit]:表示启动顺序和依赖关系;
- [Service]:服务的启动行为以及如何启动、重启、停止等信息;
- [Install]:表示如何安装配置文件;
[Unit]标签下的字段:
Description:服务的描述,用于描述服务的名称或用途。
After:服务启动的顺序,表示服务将在哪些其他服务之后启动。
StartLimitIntervalSec:服务启动失败后的重试间隔时间,单位为秒。
[Service]标签下的字段:
Type:服务的类型。
Restart:服务失败后的重启策略。
RestartSec:服务重启的间隔时间,单位为秒。
ExecStart:服务的启动命令,可以是一个命令或一个脚本,用于启动服务。
ExecStop:服务的停止命令,用于停止服务。
WorkingDirectory:服务的工作目录,用于指定服务的工作目录。
User:服务运行的用户,用于指定服务运行的用户。
Group:服务运行的用户组,用于指定服务运行的用户组。
StandardOutput:服务的标准输出,用于指定服务的标准输出文件。
StandardError:服务的标准错误输出,用于指定服务的标准错误输出文件。
PrivateTmp:服务是否使用私有的临时文件系统。
TimeoutStartSec:服务启动的超时时间,单位为秒。
TimeoutStopSec:服务停止的超时时间,单位为秒。
PIDFile:服务的PID文件,用于指定服务的PID文件路径。
Environment:服务的环境变量,用于指定服务的环境变量。
ExecReload:服务的重载命令,用于重新加载服务的配置文件。
KillMode:服务的杀死模式,有control-group、process、mixed等模式。
[Install]标签下的字段:
WantedBy:服务所属的target,表示服务将在哪些target下启动。
RequiredBy:服务所需的其他服务,表示服务需要哪些其他服务才能启动。
Also:服务的别名,用于指定服务的别名。
DefaultInstance:服务的默认实例,用于指定服务的默认实例。
Alias:服务的别名,用于指定服务的别名。
Documentation:服务的文档,用于指定服务的文档路径。
ConditionPathExists:服务启动的条件,表示服务启动前需要检查的文件或目录是否存在。
ConditionPathIsExecutable:服务启动的条件,表示服务启动前需要检查的文件是否可执行。
ConditionPathIsSymbolicLink:服务启动的条件,表示服务启动前需要检查的文件是否为符号链接。
ConditionPathIsMountPoint:服务启动的条件,表示服务启动前需要检查的目录是否为挂载点。
ConditionPathIsReadWrite:服务启动的条件,表示服务启动前需要检查的文件是否可读写。
ConditionFileNotEmpty:服务启动的条件,表示服务启动前需要检查的文件是否为空。
ConditionFileIsExecutable:服务启动的条件,表示服务启动前需要检查的文件是否可执行。
ConditionFileIsSymbolicLink:服务启动的条件,表示服务启动前需要检查的文件是否为符号链接。
ConditionFileIsReadWrite:服务启动的条件,表示服务启动前需要检查的文件是否可读写。
ConditionKernelCommandLine:服务启动的条件,表示服务启动前需要检查的内核命令行是否包含指定的参数。
三、管理方式
.service 文件配置的服务常用systemd管理。然而,systemd有系统和用户区分;系统(/user/lib/systemd/system/)、用户(/etc/lib/systemd/user/)。
一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/目录下面。
四、Java应用注册为service服务
4.1、准备shell启动、关闭脚本
#!/bin/sh
export JAVA_HOME=/opt/module/jdk1.8.0_11
export PATH=$JAVA_HOME/bin:$PATH
cd /opt/testservice
service=$1
servicePort=$3
debug='-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=8555'
# 检查数据完整性
function check_data_integrity(){
data_center_base_path=/opt/testservice
echo "${data_center_base_path}"
if [ ! -d "${data_center_base_path}/${service}/" ]; then
echo "服务不存在,请确认"
exit
fi
cd ${data_center_base_path}/${service}
}
function start_service(){
nohup java -Xms256m -Xmx1024m -jar -Dlog4j2.formatMsgNoLookups=true -XX:+UseG1GC ./${service}*.jar --server.port=${servicePort} >/dev/null 2>&1 &
echo "$!" > pid
echo "${service} started success."
}
function stop_service(){
service_pid=$(cat pid)
echo "stopping ${service} ..."
kill -9 ${service_pid}
echo "stopped ${service}"
}
#开始方法
start() {
start_service
}
#结束方法
stop() {
stop_service
}
case "$2" in
start)
check_data_integrity
start
;;
stop)
check_data_integrity
stop
;;
restart)
check_data_integrity
stop
start
;;
*)
echo "Userage: $0 {start|stop|restart}"
exit 1
esac
4.1、进入系统服务列表的文件夹
cd /etc/systemd/system
4.2、新建文件 demo-test.service
[Unit]
Description=data-work service manage
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
LimitNOFILE=655360
ExecStart=/opt/testservice/launch.sh demo-test start 9080
ExecStop=/opt/testservice/launch.sh demo-test stop
Type=forking
PrivateTmp=true
RestartSec=5s
Restart=on-failure
[Install]
WantedBy=multi-user.target
4.3、启动命令
systemctl start test.service
4.4、其他命令
systemctl restart test.service //重启service脚本
systemctl stop test.service //停止service脚本
systemctl status test.service //查看service状态
journalctl -u test.service //查看service日志,journalctl用于查看系统日志,-u指定服务名称。
systemctl daemon-reload //重新加载systemd守护程序,以便它可以读取任何新的或更改的服务文件。
ps auxw --sort=-rss //查看内存占用情况,列出所有进程,并按内存使用量从高到低排序。
df -hl //查看磁盘占用情况
评论区