侧边栏壁纸
  • 累计撰写 32 篇文章
  • 累计创建 18 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Linux自定义service,java程序做系统服务

bsdlzg
2023-06-05 / 0 评论 / 2 点赞 / 166 阅读 / 1,541 字

一、什么是.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                           //查看磁盘占用情况
2

评论区