CentOS7 添加自定义系统服务案例

本文介绍了一个关于Systemd服务启动时遇到超时错误的问题,并提供了详细的解决方案。通过调整脚本逻辑和配置文件设置,成功解决了服务启动过程中因长时间运行而引发的超时错误。

示例一:

执行脚本/root/project/systemctl/test.sh()

#########################################################################
# File Name   : test.sh
# Author      : Youner Liu
# Mail        : younger_liucn@126.com
# Created Time: Wed 14 Sep 2016 07:13:37 PM CST
# Description : 
#########################################################################
#!/bin/bash

function test()
{
	count=0
	num=3000
	while [ ${count} -lt ${num} ]
	do
		if [ -f /root/project/systemctl/stop ]; then
			break
		fi
		count=$((count+1))
		date >> /root/project/systemctl/test.log
		echo "hello world ${count}" >> /root/project/systemctl/test.log
		sleep 1
	done
}

if [ ${1} == "start" ]; then
	test;
elif [ ${1} == "stop" ];then
	echo "touch  /root/project/systemctl/stop"
	touch  /root/project/systemctl/stop
fi
myservice.service源码(/usr/lib/systemd/system/myservice.service)
[Unit]
Description=my service
 
[Service]
Type=forking
PIDFile=/root/project/systemctl/myservice.pid
ExecStart=/usr/bin/sh /root/project/systemctl/test.sh start &
ExecStop=/usr/bin/sh /root/project/systemctl/test.sh stop
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

测试:

[root@node0 systemctl]# systemctl start myservice.service
Job for myservice.service failed because a timeout was exceeded. See "systemctl status myservice.service" and "journalctl -xe" for details.
[root@node0 systemctl]# systemctl status myservice.service
● myservice.service - nginx - my service
   Loaded: loaded (/usr/lib/systemd/system/myservice.service; disabled; vendor preset: disabled)
   Active: failed (Result: timeout) since Wed 2016-09-14 21:40:46 CST; 44s ago
  Process: 7459 ExecStart=/usr/bin/sh /root/project/systemctl/test.sh start & (code=killed, signal=TERM)

Sep 14 21:39:16 node0 systemd[1]: Starting nginx - my service...
Sep 14 21:40:46 node0 systemd[1]: myservice.service start operation timed out. Terminating.
Sep 14 21:40:46 node0 systemd[1]: Failed to start nginx - my service.
Sep 14 21:40:46 node0 systemd[1]: Unit myservice.service entered failed state.
Sep 14 21:40:46 node0 systemd[1]: myservice.service failed.
[root@node0 systemctl]# cat /root/project/systemctl/test.log 

Wed Sep 14 21:39:16 CST 2016
hello world 1
....
Wed Sep 14 21:40:45 CST 2016
hello world 89
Wed Sep 14 21:40:46 CST 2016
hello world 90
[root@node0 systemctl]# 

systemctl start myservice.service卡住90秒;然后报出timeout

这个问题应该如何解决那????

整改

脚本/root/project/systemctl/test_start.sh

#########################################################################
# File Name   : test_start.sh
# Author      : Youner Liu
# Mail        : younger_liucn@126.com
# Created Time: Wed 14 Sep 2016 07:13:37 PM CST
# Description : 
#########################################################################
#!/bin/bash

function test()
{
	count=0
	num=3000
	echo > /root/project/systemctl/test.log
	while [ ${count} -lt ${num} ]
	do
		if [ -f /root/project/systemctl/stop ]; then
			rm -rf /root/project/systemctl/stop;
			break
		fi
		count=$((count+1))
		date >> /root/project/systemctl/test.log
		echo "hello world ${count}" >> /root/project/systemctl/test.log
		sleep 1
	done
}

test


脚本/root/project/systemctl/test_stop.sh
#########################################################################
# File Name   : test_stop.sh
# Author      : Youner Liu
# Mail        : younger_liucn@126.com
# Created Time: Wed 14 Sep 2016 07:13:37 PM CST
# Description : 
#########################################################################
#!/bin/bash

echo "touch  /root/project/systemctl/stop"
touch  /root/project/systemctl/stop

脚本/root/project/systemctl/test.sh

#########################################################################
# File Name   : test.sh
# Author      : Youner Liu
# Mail        : younger_liucn@126.com
# Created Time: Wed 14 Sep 2016 07:13:37 PM CST
# Description : 
#########################################################################
#!/bin/bash

if [ ${1} == "start" ]; then
	sh /root/project/systemctl/test_start.sh &
elif [ ${1} == "stop" ];then
	sh /root/project/systemctl/test_start.sh &
fi

myservice.service源码(/usr/lib/systemd/system/myservice.service)
[Unit]
Description=my service
 
[Service]
Type=forking
#PIDFile=/root/project/systemctl/myservice.pid
ExecStart=/usr/bin/sh /root/project/systemctl/test.sh start
ExecStop=/usr/bin/sh /root/project/systemctl/test.sh stop
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

OK





<think>好的,我现在要帮助用户解决在CentOS 7中创建服务文件的问题。用户之前询问过ENVI软件去除阴影的教程,现在转向了系统管理相关的问题,说明他可能有多个领域的需求。不过当前的问题是关于CentOS 7服务文件创建,我需要集中精力在这方面。 首先,我需要回想一下CentOS 7服务管理机制。记得CentOS 7使用systemd作为默认的初始化系统,所以服务文件应该与systemd相关。用户可能已经了解过基本的虚拟机安装和文件操作,如引用中提到的创建虚拟机和目录管理,但具体到服务文件创建可能还不清楚。 接下来,我需要考虑用户的需求。用户想要创建服务文件,可能希望将某个自定义应用程序或脚本作为系统服务来管理,以便能够使用systemctl命令启动、停止、启用开机启动等。这通常涉及到编写.service文件,并放置到正确的目录中。 需要分步骤讲解:首先创建服务文件的内容,包括定义服务单元、指定执行命令、设置依赖和运行模式等。然后,需要将服务文件放到/etc/systemd/system/目录下,接着重新加载systemd配置,最后启动和启用服务。可能还需要验证服务状态和查看日志。 要注意用户可能对systemd不熟悉,所以需要详细解释每个步骤和参数的含义。例如,[Unit]部分的描述和依赖,[Service]中的执行命令和重启策略,以及[Install]中的目标设置。此外,提供实际示例会更有帮助,比如用Python脚本作为例子,这样用户更容易理解。 另外,用户可能遇到权限问题,所以需要提醒使用sudo命令。还可能忘记重新加载systemd配置,导致服务未被识别,这也是常见问题,需强调执行systemctl daemon-reload的重要性。 最后,用户可能需要进一步的问题,比如如何调试服务、如何处理依赖关系或自定义工作目录,因此生成相关问题可以提前帮助他们解决潜在疑问。需要确保回答结构清晰,步骤详细,并验证命令的正确性,避免误导用户。</think>以下是CentOS 7中创建自定义服务文件的完整教程,包含Systemd服务单元配置规范和实践示例: --- ### 一、服务文件基础结构 1. **核心目录** Systemd服务文件存放路径为: ```bash /usr/lib/systemd/system/ # 系统服务 /etc/systemd/system/ # 用户级服务(推荐位置) ``` 2. **文件命名规范** 服务文件必须以`.service`结尾,例如: ```bash sudo vim /etc/systemd/system/my_custom_service.service ``` --- ### 二、服务文件编写规范 #### 标准模板 ```ini [Unit] Description=My Custom Service # 服务描述 After=network.target # 依赖的网络服务[^2] [Service] Type=simple # 服务类型(simple/forking) ExecStart=/usr/bin/python3 /opt/app/main.py # 启动命令 WorkingDirectory=/opt/app # 工作目录 Restart=always # 故障自动重启策略 User=appuser # 运行用户 Group=appgroup # 运行组 [Install] WantedBy=multi-user.target # 系统启动级别 ``` #### 关键参数说明 - **Type类型**: - `simple`:直接执行命令(默认) - `forking`:命令会fork子进程(如守护进程) - **Restart策略**: - `no`:不自动重启 - `on-success`:退出码0时重启 - `on-failure`:非0退出码重启 - `always`:无条件重启 --- ### 三、实战操作步骤 #### 案例:部署Python脚本为系统服务 1. **创建服务文件** ```bash sudo vi /etc/systemd/system/pyapp.service ``` 2. **写入配置内容** ```ini [Unit] Description=Python Data Processing Service After=mysql.service [Service] ExecStart=/usr/bin/python3 /data/scripts/processor.py RestartSec=5 Restart=on-failure Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin" [Install] WantedBy=multi-user.target ``` 3. **重载systemd配置** ```bash sudo systemctl daemon-reload ``` 4. **服务管理命令** ```bash sudo systemctl start pyapp # 启动服务 sudo systemctl enable pyapp # 设置开机自启 sudo systemctl status pyapp # 查看实时状态 journalctl -u pyapp -f # 查看完整日志[^2] ``` --- ### 四、调试技巧 1. **环境变量注入** 在`[Service]`段添加: ```ini EnvironmentFile=/etc/sysconfig/pyapp ``` 然后在指定文件中定义变量: ```bash # /etc/sysconfig/pyapp API_KEY=xxxxxx DEBUG_MODE=true ``` 2. **多命令执行** 使用`ExecStartPre`和`ExecStopPost`定义钩子: ```ini ExecStartPre=/bin/bash -c 'echo "服务启动于 $(date)" >> /var/log/pyapp.log' ExecStopPost=/usr/bin/curl -X POST http://monitor.example.com/stop ``` --- ### 五、服务验证方法 1. **启动状态检查** ```bash systemctl is-active pyapp # 返回active/inactive ``` 2. **依赖关系树** ```bash systemctl list-dependencies pyapp ``` 3. **资源监控** ```bash systemd-cgtop -n 10 # 显示CPU/Memory占用最高的服务 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoungerChina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值