目录
- 一、服务入门
- 1.1 概述
- 1.2 创建及管理Systemd服务
- 1.2.1 创建service文件
- 1.2.2 创建脚本文件
- 1.2.3 管理Systemd服务
- 1.2.4 服务输出
- 1.3 服务文件常用参数
- 1.3.1 UNIT单元
- 1.3.2 service单元
- 1.3.3 install单元
- 1.4 target文件常用参数
- 1.5 周期性任务timer
- 1.5.1 创建timer文件
- 1.5.2 管理timer文件
- 1.5.3 timer单元配置选项
- 二、周期性执行服务crond
- 2.1 定义
- 2.2 文件及命令
- 2.3 格式
- 2.4 /etc/crontab任务举例
一、服务入门
1.1 概述
- 服务定义:服务(Service)是指在后台运行的程序或进程,它们通常用于执行特定的任务,如网络服务、日志记录、定时任务等。服务可以由系统在启动时自动运行,也可以根据需要手动启动或停止。
- 服务文件:Systemd服务单元由.service文件定义,这些文件通常位于/etc/systemd/system/目录下。一个.service文件包含了启动、停止和维护服务所需的指令和配置。
- 服务文件内容:
- [Unit]部分:包含服务的元数据和依赖关系。
- [Service]部分:定义服务的运行参数,如启动命令、工作目录、环境变量等。
- [Install]部分:定义服务安装时的行为,如服务应该被哪个目标启动。
- 服务状态
- 启动(Started):服务正在运行。
- 停止(Stopped):服务已停止运行。
- 激活(Active):服务处于活动状态,可能是启动或停止状态
1.2 创建及管理Systemd服务
1.2.1 创建service文件
/etc/systemd/system/目录下创建
- recordTime.service
[Unit] # 任务描述:任务管理,status中会显示 Description=记录时间[Service] # 服务类型:常规类型 # 执行命令后系统则认为任务running中,直到用户显式关闭 Type=simple # 服务启动后执行的命令(以下二选一),多语句分号分隔 # 1、服务执行用户脚本:脚本可用shell,python,C++等编写 # 2、服务执行系统命令:如 /usr/bin/date > /home/date_receive.txt ExecStart=/bin/bash /root/shellFolder/recordTime.sh[Install] # 启动后挂载在哪个目标之下 WantedBy=multi-user.target
- 增加读写权限
chmod 644 /etc/systemd/system/recordTime.service
1.2.2 创建脚本文件
/root/shellFolder/目录下
- recordTime.sh
#!/bin/bash /usr/bin/date >> /home/shellFolder/date_receive.txt
- 修改权限:
chmod 700 recordTime.sh
1.2.3 管理Systemd服务
- 重新加载Systemd配置:
systemctl daemon-reload
在创建或修改服务文件后需要执行
- 日常操作
功能 命令 查看已定义的所有服务 systemctl list-units --type=target
启动服务 systemctl start recordTime.service
重启服务 systemctl restart recordTime.service
停止服务 systemctl stop recordTime.service
查看服务状态 systemctl status recordTime.service
设置开机自启 systemctl enable recordTime.service
禁用服务开机自启 systemctl disable recordTime.service
查看服务日志 journalctl -u recordTime.service
1.2.4 服务输出
- 命令行交互
-># systemctl daemon-reload -># systemctl start recordTime.service -># cat date_receive.txt ->Sun Mar 31 19:39:27 CST 2024 -># systemctl enable recordTime.service ->Created symlink /etc/systemd/system/multi-user.target.wants/recordTime.service → /etc/systemd/system/recordTime.service. -># systemctl status recordTime.service ● recordTime.service - 记录时间Loaded: loaded (/etc/systemd/system/recordTime.service; enabled; vendor preset: disabled)Active: inactive (dead)3月 31 19:39:27 systemd[1]: Started 记录时间.3月 31 19:39:27 systemd[1]: recordTime.service: Succeeded.
重点输出:enable是开机启动,active因为只有一句,执行完就结束了,要是持续的服务,这里就会是active(running),再下面就是执行日志
- 功能小记:因为开机启动,所以可以用来记录上次开机时间
1.3 服务文件常用参数
1.3.1 UNIT单元
- 总括
名称 解释 Description 服务描述,说明服务的功能、目的 Documentation 提供服务文档的URL或路径,以便用户和管理员了解如何使用和维护服务 After 指定服务启动的顺序,服务将在列出的单元之后启动。例如,After=network.target表示服务将在网络服务启动后启动。 Before 参After Requires 指定服务启动所需的其他服务单元。如果这些服务未运行,Systemd将尝试启动它们 Wants 指定服务希望启动的其他服务单元,但不强制要求。这是软依赖,即使这些服务未运行,也不会阻止当前服务的启动 Refuses 指定服务不希望启动的其他服务单元。这是用于防止某些服务启动的软策略 BindsTo 指定服务绑定到的其他服务单元。如果绑定的服务未运行,当前服务也不会启动 PartOf 指定服务所属的更大的服务单元组。这通常用于表示服务是某个更大系统的一部分 以上可接service文件如:recordTime.service或target见1.4
1.3.2 service单元
- 总括(标记为必选项)
名称 功能 Type 定义服务的类型,例如simple、forking、oneshot、notify或dbus,Type指定了Systemd如何管理服务进程 ExecStart 指定启动服务时执行的命令或脚本。这是服务启动时运行的主要命令 ExecStop 指定停止服务时执行的命令或脚本。这个命令通常用于清理资源或正常关闭服务 ExecReload 指定重新加载服务配置时执行的命令。这通常用于应用服务配置的更改而不停止服务 Restart 定义服务失败时的重启策略,例如on-failure、always、never等 RestartSec 定义服务重启前的等待时间,单位是秒 TimeoutStartSec 定义服务启动超时的时间,单位是秒 TimeoutStopSec 定义服务停止超时的时间,单位是秒 PIDFile 指定服务进程ID文件的路径。Systemd将使用这个文件来跟踪服务的进程ID User 指定运行服务的用户名称 Group 指定运行服务的用户组 Environment 设置服务运行时的环境变量 EnvironmentFile 指定一个文件,其中的键值对将被设置为服务的环境变量 WorkingDirectory 指定服务进程的工作目录 StandardInput 指定服务的标准输入源,例如tty或null StandardOutput 指定服务的标准输出目标,例如journal、console或file StandardError 指定服务的标准错误输出目标,通常与StandardOutput相同 SuccessExitStatus 定义服务进程退出时被认为是成功的退出状态码 RemainAfterExit 如果设置为yes,即使服务的主进程退出,Systemd也会认为服务仍在运行 - Type详解
名称 解释 simple 这是默认的服务类型,适用于大多数服务。simple 类型的服务通常启动一个单一的进程,并且这个进程会一直运行直到被停止。Systemd会根据ExecStart指令启动服务,并在ExecStop指令指定的命令被执行时停止服务 oneshot 这种类型的服务执行一次性任务,启动后立即退出。Systemd会等待服务进程退出,然后自动认为服务已经启动并完成。oneshot 类型的服务通常用于不需要长时间运行的任务 idle 这种类型的服务在系统空闲时运行。它们通常用于执行不需要实时响应的任务,如系统维护或日志分析 forking 适用于传统的Unix守护进程,这些守护进程在启动时会fork一个子进程,然后父进程立即退出。Systemd会等待父进程退出,然后继续启动其他服务。如果父进程没有退出,Systemd会认为服务启动失败 notify 类似于simple,但服务进程会在完成初始化并准备好接收请求时发送一个通知。这允许Systemd更好地并行化服务的启动过程。如果服务没有发送通知,Systemd会认为服务启动失败
1.3.3 install单元
- WantedBy
- 这个指令指定了服务单元文件应该被安装到哪个或哪些.target文件的.wants目录下。当Systemd启动到达指定的.target时,它会查看该.target的.wants目录下的所有服务单元文件,并启动它们。
- 例如,如果你想让服务在系统进入多用户文本模式时启动,你可以设置
WantedBy=multi-user.target
1.4 target文件常用参数
- .target文件的作用
- 定义系统状态:.target文件定义了系统启动或运行时应该达到的状态,例如多用户模式、图形界面模式或维护模式。
- 管理服务依赖:通过Requires和Wants指令,.target文件可以指定一组服务的启动顺序和依赖关系。
- 控制服务的激活:通过WantedBy指令,.target文件可以控制服务是否应该在系统启动时自动激活。
- 常用总括
名称 解释 graphical.target 代表图形用户界面(GUI)的目标状态。在这个状态下,系统会启动X窗口系统和桌面环境,提供图形界面供用户操作。 multi-user.target 代表多用户文本模式的状态。在这个状态下,系统允许多个用户通过文本终端登录,但不启动图形界面。 rescue.target 用于系统恢复的目标状态。在这个状态下,系统会启动一个最小化的环境,通常用于修复系统问题或恢复丢失的数据。 emergency.target 用于紧急恢复的目标状态。当系统无法正常启动时,可以进入这个状态进行故障排除。在这个状态下,系统通常只提供基本的命令行界面。 network.target 网络服务已完成启动 - 格式及位置:同service,只是没有[service]项,位置在/etc/systemd/system
- 操作
# 列出系统中所有已定义的目标单元 systemctl list-units --type=target # 获取系统当前默认target systemctl get-default # 设置系统启动默认进入的target systemctl set-default multi-user.target
1.5 周期性任务timer
1.5.1 创建timer文件
/etc/systemd/system/目录下创建
- recordTime.timer
[Unit] Description=每五秒触发一次[Timer] OnUnitActiveSec=1m[Install] WantedBy=timers.target
权限:不需添加权限,
systemctl status recordTime.timer
,可以直接查看 - recordTime.service—同1.2.1
timer\service同名:使用同名是一种方便的方法来管理和调度 systemd 服务
timer\service异名:需在timer文件的Unit指定service,Unit=recordTime.service
1.5.2 管理timer文件
- 生效:任务会在系统空闲时执行,不一定是上面写的就准时执行
- 常规管理操作
# 查看定时器状态 systemctl start|stop|restart|status recordTime.timer # 查看所有定时器 systemctl list-timers --all # 查看定时器的下一个激活时间 systemctl show --property=NextElapse recordTime.timer
1.5.3 timer单元配置选项
- 常用选项
名称 解释 OnBootSec 在系统启动后多少秒后执行任务(秒s,分m,时h,天d) OnUnitActiveSec 在Service单元上次变为active状态后多久后再次执行任务(秒s,分m,时h,天d) OnCalendar 基于日历时间执行任务,可以是绝对时间或相对时间(如*-*-* 12:00:00表示每天中午12点执行或daily 12:00:00、weekly Mon 03:00:00) Persistent 如果设置为yes,如果错过启动,会在下次重启时尽快执行任务 AccuracySec 任务执行的最大误差时间,如果任务在这个时间内没有执行,systemd会尽快执行它 Unit 如果timer和service异名,则需要在这里指定,如 Unit=recordTime.service
二、周期性执行服务crond
2.1 定义
- 什么是crond服务?
crond服务是一个守护进程,它会在后台持续运行,并定期检查是否有需要执行的任务。如果有,它会根据预定的时间规则来执行这些任务。这就像是一个内置的闹钟,到了设定的时间就会触发相应的操作。
- 特点
- 最小周期:crond服务会每分钟检索一遍任务列表,修改完配置文件要重载一下
- 生效:任务会在系统空闲时执行,不一定是写几点几分就准时执行
2.2 文件及命令
-
文件位置
- 系统级的crontab文件通常位于/etc/crontab
- 用户级可指定
-
crontab命令
crontab -l(list):查看当前用户的crontab文件内容 crontab -e(edit):编辑当前用户的crontab文件 crontab -i:删除crontab文件内容,在删除前会提示确认 crontab -r:删除当前用户的crontab文件 crontab -u usr:指定用户usr的crontab文件
-
systemctl命令
systemctl start|stop|restart|status cron.service # 重新载入配置 systemctl daemon-reload
2.3 格式
- 格式说明
# 任务定义: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command-to-be-executed # command:命令需绝对路径,可以用whereis 命令名 来确定
- 符号说明
*:代表所有可能的值。
,:可以用逗号隔开的值指定一个列表范围。
-:可以用整数之间的中杠表示一个整数范围。
/:可以用正斜线指定时间的间隔频率。
2.4 /etc/crontab任务举例
- 基本格式
# 固定间隔时间:每1分钟执行一次command * * * * * command # 每小时的第3和第15分钟执行 3,15 * * * * command # 在上午8点到11点的第3和第15分钟执行 3,15 8-11 * * * command # 每两天(即每隔一天)的上午8点到11点的第3和第15分钟执行 3,15 8-11 */2 * * command # 每个星期一的上午8点到11点的第3和第15分钟执行 3,15 8-11 * * 1 command
- 举例
# 每晚的21:30关机 30 21 * * * /usr/sbin/shutdown -h now # 每月1、10、22日的4:45重启 45 4 1,10,22 * * /usr/sbin/reboot # 每周六、周日的1:10重启 10 1 * * 6,0 /usr/sbin/reboot # 每天18:00至23:00之间第0、30分各记录一次时间 0,30 18-23 * * * /usr/bin/date > /home/date_receive.txt # 每星期六的晚上11 : 00 pm重启 0 23 * * 6 /usr/sbin/reboot # 每两小时(隔一小时)记录一次时间 * */2 * * * /usr/bin/date > /home/date_receive.txt # 晚上11点到早上7点之间,每隔一小时重启一次 * 23-7/2 * * * /usr/sbin/reboot # 每月的4号与每周一到周三的11点重启一次 0 11 4 * mon-wed /usr/sbin/reboot # 一月一号的4点重启一次 0 4 1 jan * /usr/sbin/reboot # 每小时执行一次以下脚本 0 1 * * * /usr/local/bin/check_server_status.sh